Home | History | Annotate | Download | only in util
      1 /*
      2  * Copyright  2010 Intel Corporation
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     21  * DEALINGS IN THE SOFTWARE.
     22  */
     23 
     24 /**
     25  * \file ralloc.h
     26  *
     27  * ralloc: a recursive memory allocator
     28  *
     29  * The ralloc memory allocator creates a hierarchy of allocated
     30  * objects. Every allocation is in reference to some parent, and
     31  * every allocated object can in turn be used as the parent of a
     32  * subsequent allocation. This allows for extremely convenient
     33  * discarding of an entire tree/sub-tree of allocations by calling
     34  * ralloc_free on any particular object to free it and all of its
     35  * children.
     36  *
     37  * The conceptual working of ralloc was directly inspired by Andrew
     38  * Tridgell's talloc, but ralloc is an independent implementation
     39  * released under the MIT license and tuned for Mesa.
     40  *
     41  * talloc is more sophisticated than ralloc in that it includes reference
     42  * counting and useful debugging features.  However, it is released under
     43  * a non-permissive open source license.
     44  */
     45 
     46 #ifndef RALLOC_H
     47 #define RALLOC_H
     48 
     49 #include <stddef.h>
     50 #include <stdarg.h>
     51 #include <stdbool.h>
     52 
     53 #include "macros.h"
     54 
     55 #ifdef __cplusplus
     56 extern "C" {
     57 #endif
     58 
     59 /**
     60  * \def ralloc(ctx, type)
     61  * Allocate a new object chained off of the given context.
     62  *
     63  * This is equivalent to:
     64  * \code
     65  * ((type *) ralloc_size(ctx, sizeof(type))
     66  * \endcode
     67  */
     68 #define ralloc(ctx, type)  ((type *) ralloc_size(ctx, sizeof(type)))
     69 
     70 /**
     71  * \def rzalloc(ctx, type)
     72  * Allocate a new object out of the given context and initialize it to zero.
     73  *
     74  * This is equivalent to:
     75  * \code
     76  * ((type *) rzalloc_size(ctx, sizeof(type))
     77  * \endcode
     78  */
     79 #define rzalloc(ctx, type) ((type *) rzalloc_size(ctx, sizeof(type)))
     80 
     81 /**
     82  * Allocate a new ralloc context.
     83  *
     84  * While any ralloc'd pointer can be used as a context, sometimes it is useful
     85  * to simply allocate a context with no associated memory.
     86  *
     87  * It is equivalent to:
     88  * \code
     89  * ((type *) ralloc_size(ctx, 0)
     90  * \endcode
     91  */
     92 void *ralloc_context(const void *ctx);
     93 
     94 /**
     95  * Allocate memory chained off of the given context.
     96  *
     97  * This is the core allocation routine which is used by all others.  It
     98  * simply allocates storage for \p size bytes and returns the pointer,
     99  * similar to \c malloc.
    100  */
    101 void *ralloc_size(const void *ctx, size_t size) MALLOCLIKE;
    102 
    103 /**
    104  * Allocate zero-initialized memory chained off of the given context.
    105  *
    106  * This is similar to \c calloc with a size of 1.
    107  */
    108 void *rzalloc_size(const void *ctx, size_t size) MALLOCLIKE;
    109 
    110 /**
    111  * Resize a piece of ralloc-managed memory, preserving data.
    112  *
    113  * Similar to \c realloc.  Unlike C89, passing 0 for \p size does not free the
    114  * memory.  Instead, it resizes it to a 0-byte ralloc context, just like
    115  * calling ralloc_size(ctx, 0).  This is different from talloc.
    116  *
    117  * \param ctx  The context to use for new allocation.  If \p ptr != NULL,
    118  *             it must be the same as ralloc_parent(\p ptr).
    119  * \param ptr  Pointer to the memory to be resized.  May be NULL.
    120  * \param size The amount of memory to allocate, in bytes.
    121  */
    122 void *reralloc_size(const void *ctx, void *ptr, size_t size);
    123 
    124 /// \defgroup array Array Allocators @{
    125 
    126 /**
    127  * \def ralloc_array(ctx, type, count)
    128  * Allocate an array of objects chained off the given context.
    129  *
    130  * Similar to \c calloc, but does not initialize the memory to zero.
    131  *
    132  * More than a convenience function, this also checks for integer overflow when
    133  * multiplying \c sizeof(type) and \p count.  This is necessary for security.
    134  *
    135  * This is equivalent to:
    136  * \code
    137  * ((type *) ralloc_array_size(ctx, sizeof(type), count)
    138  * \endcode
    139  */
    140 #define ralloc_array(ctx, type, count) \
    141    ((type *) ralloc_array_size(ctx, sizeof(type), count))
    142 
    143 /**
    144  * \def rzalloc_array(ctx, type, count)
    145  * Allocate a zero-initialized array chained off the given context.
    146  *
    147  * Similar to \c calloc.
    148  *
    149  * More than a convenience function, this also checks for integer overflow when
    150  * multiplying \c sizeof(type) and \p count.  This is necessary for security.
    151  *
    152  * This is equivalent to:
    153  * \code
    154  * ((type *) rzalloc_array_size(ctx, sizeof(type), count)
    155  * \endcode
    156  */
    157 #define rzalloc_array(ctx, type, count) \
    158    ((type *) rzalloc_array_size(ctx, sizeof(type), count))
    159 
    160 /**
    161  * \def reralloc(ctx, ptr, type, count)
    162  * Resize a ralloc-managed array, preserving data.
    163  *
    164  * Similar to \c realloc.  Unlike C89, passing 0 for \p size does not free the
    165  * memory.  Instead, it resizes it to a 0-byte ralloc context, just like
    166  * calling ralloc_size(ctx, 0).  This is different from talloc.
    167  *
    168  * More than a convenience function, this also checks for integer overflow when
    169  * multiplying \c sizeof(type) and \p count.  This is necessary for security.
    170  *
    171  * \param ctx   The context to use for new allocation.  If \p ptr != NULL,
    172  *              it must be the same as ralloc_parent(\p ptr).
    173  * \param ptr   Pointer to the array to be resized.  May be NULL.
    174  * \param type  The element type.
    175  * \param count The number of elements to allocate.
    176  */
    177 #define reralloc(ctx, ptr, type, count) \
    178    ((type *) reralloc_array_size(ctx, ptr, sizeof(type), count))
    179 
    180 /**
    181  * Allocate memory for an array chained off the given context.
    182  *
    183  * Similar to \c calloc, but does not initialize the memory to zero.
    184  *
    185  * More than a convenience function, this also checks for integer overflow when
    186  * multiplying \p size and \p count.  This is necessary for security.
    187  */
    188 void *ralloc_array_size(const void *ctx, size_t size, unsigned count) MALLOCLIKE;
    189 
    190 /**
    191  * Allocate a zero-initialized array chained off the given context.
    192  *
    193  * Similar to \c calloc.
    194  *
    195  * More than a convenience function, this also checks for integer overflow when
    196  * multiplying \p size and \p count.  This is necessary for security.
    197  */
    198 void *rzalloc_array_size(const void *ctx, size_t size, unsigned count) MALLOCLIKE;
    199 
    200 /**
    201  * Resize a ralloc-managed array, preserving data.
    202  *
    203  * Similar to \c realloc.  Unlike C89, passing 0 for \p size does not free the
    204  * memory.  Instead, it resizes it to a 0-byte ralloc context, just like
    205  * calling ralloc_size(ctx, 0).  This is different from talloc.
    206  *
    207  * More than a convenience function, this also checks for integer overflow when
    208  * multiplying \c sizeof(type) and \p count.  This is necessary for security.
    209  *
    210  * \param ctx   The context to use for new allocation.  If \p ptr != NULL,
    211  *              it must be the same as ralloc_parent(\p ptr).
    212  * \param ptr   Pointer to the array to be resized.  May be NULL.
    213  * \param size  The size of an individual element.
    214  * \param count The number of elements to allocate.
    215  *
    216  * \return True unless allocation failed.
    217  */
    218 void *reralloc_array_size(const void *ctx, void *ptr, size_t size,
    219 			  unsigned count);
    220 /// @}
    221 
    222 /**
    223  * Free a piece of ralloc-managed memory.
    224  *
    225  * This will also free the memory of any children allocated this context.
    226  */
    227 void ralloc_free(void *ptr);
    228 
    229 /**
    230  * "Steal" memory from one context, changing it to another.
    231  *
    232  * This changes \p ptr's context to \p new_ctx.  This is quite useful if
    233  * memory is allocated out of a temporary context.
    234  */
    235 void ralloc_steal(const void *new_ctx, void *ptr);
    236 
    237 /**
    238  * Reparent all children from one context to another.
    239  *
    240  * This effectively calls ralloc_steal(new_ctx, child) for all children of \p old_ctx.
    241  */
    242 void ralloc_adopt(const void *new_ctx, void *old_ctx);
    243 
    244 /**
    245  * Return the given pointer's ralloc context.
    246  */
    247 void *ralloc_parent(const void *ptr);
    248 
    249 /**
    250  * Return a context whose memory will be automatically freed at program exit.
    251  *
    252  * The first call to this function creates a context and registers a handler
    253  * to free it using \c atexit.  This may cause trouble if used in a library
    254  * loaded with \c dlopen.
    255  */
    256 void *ralloc_autofree_context(void);
    257 
    258 /**
    259  * Set a callback to occur just before an object is freed.
    260  */
    261 void ralloc_set_destructor(const void *ptr, void(*destructor)(void *));
    262 
    263 /// \defgroup array String Functions @{
    264 /**
    265  * Duplicate a string, allocating the memory from the given context.
    266  */
    267 char *ralloc_strdup(const void *ctx, const char *str) MALLOCLIKE;
    268 
    269 /**
    270  * Duplicate a string, allocating the memory from the given context.
    271  *
    272  * Like \c strndup, at most \p n characters are copied.  If \p str is longer
    273  * than \p n characters, \p n are copied, and a termining \c '\0' byte is added.
    274  */
    275 char *ralloc_strndup(const void *ctx, const char *str, size_t n) MALLOCLIKE;
    276 
    277 /**
    278  * Concatenate two strings, allocating the necessary space.
    279  *
    280  * This appends \p str to \p *dest, similar to \c strcat, using ralloc_resize
    281  * to expand \p *dest to the appropriate size.  \p dest will be updated to the
    282  * new pointer unless allocation fails.
    283  *
    284  * The result will always be null-terminated.
    285  *
    286  * \return True unless allocation failed.
    287  */
    288 bool ralloc_strcat(char **dest, const char *str);
    289 
    290 /**
    291  * Concatenate two strings, allocating the necessary space.
    292  *
    293  * This appends at most \p n bytes of \p str to \p *dest, using ralloc_resize
    294  * to expand \p *dest to the appropriate size.  \p dest will be updated to the
    295  * new pointer unless allocation fails.
    296  *
    297  * The result will always be null-terminated; \p str does not need to be null
    298  * terminated if it is longer than \p n.
    299  *
    300  * \return True unless allocation failed.
    301  */
    302 bool ralloc_strncat(char **dest, const char *str, size_t n);
    303 
    304 /**
    305  * Print to a string.
    306  *
    307  * This is analogous to \c sprintf, but allocates enough space (using \p ctx
    308  * as the context) for the resulting string.
    309  *
    310  * \return The newly allocated string.
    311  */
    312 char *ralloc_asprintf (const void *ctx, const char *fmt, ...) PRINTFLIKE(2, 3) MALLOCLIKE;
    313 
    314 /**
    315  * Print to a string, given a va_list.
    316  *
    317  * This is analogous to \c vsprintf, but allocates enough space (using \p ctx
    318  * as the context) for the resulting string.
    319  *
    320  * \return The newly allocated string.
    321  */
    322 char *ralloc_vasprintf(const void *ctx, const char *fmt, va_list args) MALLOCLIKE;
    323 
    324 /**
    325  * Rewrite the tail of an existing string, starting at a given index.
    326  *
    327  * Overwrites the contents of *str starting at \p start with newly formatted
    328  * text, including a new null-terminator.  Allocates more memory as necessary.
    329  *
    330  * This can be used to append formatted text when the length of the existing
    331  * string is already known, saving a strlen() call.
    332  *
    333  * \sa ralloc_asprintf_append
    334  *
    335  * \param str   The string to be updated.
    336  * \param start The index to start appending new data at.
    337  * \param fmt   A printf-style formatting string
    338  *
    339  * \p str will be updated to the new pointer unless allocation fails.
    340  * \p start will be increased by the length of the newly formatted text.
    341  *
    342  * \return True unless allocation failed.
    343  */
    344 bool ralloc_asprintf_rewrite_tail(char **str, size_t *start,
    345 				  const char *fmt, ...)
    346 				  PRINTFLIKE(3, 4);
    347 
    348 /**
    349  * Rewrite the tail of an existing string, starting at a given index.
    350  *
    351  * Overwrites the contents of *str starting at \p start with newly formatted
    352  * text, including a new null-terminator.  Allocates more memory as necessary.
    353  *
    354  * This can be used to append formatted text when the length of the existing
    355  * string is already known, saving a strlen() call.
    356  *
    357  * \sa ralloc_vasprintf_append
    358  *
    359  * \param str   The string to be updated.
    360  * \param start The index to start appending new data at.
    361  * \param fmt   A printf-style formatting string
    362  * \param args  A va_list containing the data to be formatted
    363  *
    364  * \p str will be updated to the new pointer unless allocation fails.
    365  * \p start will be increased by the length of the newly formatted text.
    366  *
    367  * \return True unless allocation failed.
    368  */
    369 bool ralloc_vasprintf_rewrite_tail(char **str, size_t *start, const char *fmt,
    370 				   va_list args);
    371 
    372 /**
    373  * Append formatted text to the supplied string.
    374  *
    375  * This is equivalent to
    376  * \code
    377  * ralloc_asprintf_rewrite_tail(str, strlen(*str), fmt, ...)
    378  * \endcode
    379  *
    380  * \sa ralloc_asprintf
    381  * \sa ralloc_asprintf_rewrite_tail
    382  * \sa ralloc_strcat
    383  *
    384  * \p str will be updated to the new pointer unless allocation fails.
    385  *
    386  * \return True unless allocation failed.
    387  */
    388 bool ralloc_asprintf_append (char **str, const char *fmt, ...)
    389 			     PRINTFLIKE(2, 3);
    390 
    391 /**
    392  * Append formatted text to the supplied string, given a va_list.
    393  *
    394  * This is equivalent to
    395  * \code
    396  * ralloc_vasprintf_rewrite_tail(str, strlen(*str), fmt, args)
    397  * \endcode
    398  *
    399  * \sa ralloc_vasprintf
    400  * \sa ralloc_vasprintf_rewrite_tail
    401  * \sa ralloc_strcat
    402  *
    403  * \p str will be updated to the new pointer unless allocation fails.
    404  *
    405  * \return True unless allocation failed.
    406  */
    407 bool ralloc_vasprintf_append(char **str, const char *fmt, va_list args);
    408 /// @}
    409 
    410 /**
    411  * Declare C++ new and delete operators which use ralloc.
    412  *
    413  * Placing this macro in the body of a class makes it possible to do:
    414  *
    415  * TYPE *var = new(mem_ctx) TYPE(...);
    416  * delete var;
    417  *
    418  * which is more idiomatic in C++ than calling ralloc.
    419  */
    420 #define DECLARE_ALLOC_CXX_OPERATORS_TEMPLATE(TYPE, ALLOC_FUNC)           \
    421 private:                                                                 \
    422    static void _ralloc_destructor(void *p)                               \
    423    {                                                                     \
    424       reinterpret_cast<TYPE *>(p)->~TYPE();                              \
    425    }                                                                     \
    426 public:                                                                  \
    427    static void* operator new(size_t size, void *mem_ctx)                 \
    428    {                                                                     \
    429       void *p = ALLOC_FUNC(mem_ctx, size);                               \
    430       assert(p != NULL);                                                 \
    431       if (!HAS_TRIVIAL_DESTRUCTOR(TYPE))                                 \
    432          ralloc_set_destructor(p, _ralloc_destructor);                   \
    433       return p;                                                          \
    434    }                                                                     \
    435                                                                          \
    436    static void operator delete(void *p)                                  \
    437    {                                                                     \
    438       /* The object's destructor is guaranteed to have already been      \
    439        * called by the delete operator at this point -- Make sure it's   \
    440        * not called again.                                               \
    441        */                                                                \
    442       if (!HAS_TRIVIAL_DESTRUCTOR(TYPE))                                 \
    443          ralloc_set_destructor(p, NULL);                                 \
    444       ralloc_free(p);                                                    \
    445    }
    446 
    447 #define DECLARE_RALLOC_CXX_OPERATORS(type) \
    448    DECLARE_ALLOC_CXX_OPERATORS_TEMPLATE(type, ralloc_size)
    449 
    450 #define DECLARE_RZALLOC_CXX_OPERATORS(type) \
    451    DECLARE_ALLOC_CXX_OPERATORS_TEMPLATE(type, rzalloc_size)
    452 
    453 #define DECLARE_LINEAR_ALLOC_CXX_OPERATORS(type) \
    454    DECLARE_ALLOC_CXX_OPERATORS_TEMPLATE(type, linear_alloc_child)
    455 
    456 #define DECLARE_LINEAR_ZALLOC_CXX_OPERATORS(type) \
    457    DECLARE_ALLOC_CXX_OPERATORS_TEMPLATE(type, linear_zalloc_child)
    458 
    459 
    460 /**
    461  * Do a fast allocation from the linear buffer, also known as the child node
    462  * from the allocator's point of view. It can't be freed directly. You have
    463  * to free the parent or the ralloc parent.
    464  *
    465  * \param parent   parent node of the linear allocator
    466  * \param size     size to allocate (max 32 bits)
    467  */
    468 void *linear_alloc_child(void *parent, unsigned size);
    469 
    470 /**
    471  * Allocate a parent node that will hold linear buffers. The returned
    472  * allocation is actually the first child node, but it's also the handle
    473  * of the parent node. Use it for all child node allocations.
    474  *
    475  * \param ralloc_ctx  ralloc context, must not be NULL
    476  * \param size        size to allocate (max 32 bits)
    477  */
    478 void *linear_alloc_parent(void *ralloc_ctx, unsigned size);
    479 
    480 /**
    481  * Same as linear_alloc_child, but also clears memory.
    482  */
    483 void *linear_zalloc_child(void *parent, unsigned size);
    484 
    485 /**
    486  * Same as linear_alloc_parent, but also clears memory.
    487  */
    488 void *linear_zalloc_parent(void *ralloc_ctx, unsigned size);
    489 
    490 /**
    491  * Free the linear parent node. This will free all child nodes too.
    492  * Freeing the ralloc parent will also free this.
    493  */
    494 void linear_free_parent(void *ptr);
    495 
    496 /**
    497  * Same as ralloc_steal, but steals the linear parent node.
    498  */
    499 void ralloc_steal_linear_parent(void *new_ralloc_ctx, void *ptr);
    500 
    501 /**
    502  * Return the ralloc parent of the linear parent node.
    503  */
    504 void *ralloc_parent_of_linear_parent(void *ptr);
    505 
    506 /**
    507  * Same as realloc except that the linear allocator doesn't free child nodes,
    508  * so it's reduced to memory duplication. It's used in places where
    509  * reallocation is required. Don't use it often. It's much slower than
    510  * realloc.
    511  */
    512 void *linear_realloc(void *parent, void *old, unsigned new_size);
    513 
    514 /* The functions below have the same semantics as their ralloc counterparts,
    515  * except that they always allocate a linear child node.
    516  */
    517 char *linear_strdup(void *parent, const char *str);
    518 char *linear_asprintf(void *parent, const char *fmt, ...);
    519 char *linear_vasprintf(void *parent, const char *fmt, va_list args);
    520 bool linear_asprintf_append(void *parent, char **str, const char *fmt, ...);
    521 bool linear_vasprintf_append(void *parent, char **str, const char *fmt,
    522                              va_list args);
    523 bool linear_asprintf_rewrite_tail(void *parent, char **str, size_t *start,
    524                                   const char *fmt, ...);
    525 bool linear_vasprintf_rewrite_tail(void *parent, char **str, size_t *start,
    526                                    const char *fmt, va_list args);
    527 bool linear_strcat(void *parent, char **dest, const char *str);
    528 
    529 #ifdef __cplusplus
    530 } /* end of extern "C" */
    531 #endif
    532 
    533 #endif
    534