Przeglądaj źródła

compiler/blob: Add a concept of a fixed-allocation blob

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
tags/17.3-branchpoint
Jason Ekstrand 8 lat temu
rodzic
commit
26f6d4e5c7
2 zmienionych plików z 37 dodań i 1 usunięć
  1. 16
    0
      src/compiler/blob.c
  2. 21
    1
      src/compiler/blob.h

+ 16
- 0
src/compiler/blob.c Wyświetl plik

@@ -52,6 +52,11 @@ grow_to_fit(struct blob *blob, size_t additional)
if (blob->size + additional <= blob->allocated)
return true;

if (blob->fixed_allocation) {
blob->out_of_memory = true;
return false;
}

if (blob->allocated == 0)
to_allocate = BLOB_INITIAL_SIZE;
else
@@ -105,6 +110,17 @@ blob_init(struct blob *blob)
blob->data = NULL;
blob->allocated = 0;
blob->size = 0;
blob->fixed_allocation = false;
blob->out_of_memory = false;
}

void
blob_init_fixed(struct blob *blob, void *data, size_t size)
{
blob->data = data;
blob->allocated = size;
blob->size = 0;
blob->fixed_allocation = true;
blob->out_of_memory = false;
}


+ 21
- 1
src/compiler/blob.h Wyświetl plik

@@ -56,6 +56,12 @@ struct blob {
/** The number of bytes that have actual data written to them. */
size_t size;

/** True if \c data a fixed allocation that we cannot resize
*
* \see blob_init_fixed
*/
bool fixed_allocation;

/**
* True if we've ever failed to realloc or if we go pas the end of a fixed
* allocation blob.
@@ -84,13 +90,27 @@ struct blob_reader {
void
blob_init(struct blob *blob);

/**
* Init a new, fixed-size blob.
*
* A fixed-size blob has a fixed block of data that will not be freed on
* blob_finish and will never be grown. If we hit the end, we simply start
* returning false from the write functions.
*/
void
blob_init_fixed(struct blob *blob, void *data, size_t size);

/**
* Finish a blob and free its memory.
*
* If \blob was initialized with blob_init_fixed, the data pointer is
* considered to be owned by the user and will not be freed.
*/
static inline void
blob_finish(struct blob *blob)
{
free(blob->data);
if (!blob->fixed_allocation)
free(blob->data);
}

/**

Ładowanie…
Anuluj
Zapisz