summaryrefslogtreecommitdiffstats
path: root/src/compiler/blob.h
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2017-10-11 09:52:07 -0700
committerJason Ekstrand <[email protected]>2017-10-12 21:47:06 -0700
commit26f6d4e5c7f38ab1f55d4cdef7013cc3c730f298 (patch)
treee311e7ef3c3fc4fd25fa84524e88af5a6b654663 /src/compiler/blob.h
parent49bb9f785af8349f3245bc223cb7e0e40b9fa243 (diff)
compiler/blob: Add a concept of a fixed-allocation blob
Reviewed-by: Nicolai Hähnle <[email protected]> Reviewed-by: Jordan Justen <[email protected]>
Diffstat (limited to 'src/compiler/blob.h')
-rw-r--r--src/compiler/blob.h22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/compiler/blob.h b/src/compiler/blob.h
index 8a7a28b4f3c..e23e392eedd 100644
--- a/src/compiler/blob.h
+++ b/src/compiler/blob.h
@@ -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.
@@ -85,12 +91,26 @@ 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);
}
/**