mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-03 18:38:11 +02:00
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>
This commit is contained in:
parent
49bb9f785a
commit
26f6d4e5c7
2 changed files with 37 additions and 1 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue