12d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm/* libunwind - a platform-independent unwind library 25daa8619b7e83ab4650efb7dc7cae793f444aedcmostang.com!davidm Copyright (C) 2002-2003 Hewlett-Packard Co 32d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm Contributed by David Mosberger-Tang <davidm@hpl.hp.com> 42d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 52d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidmThis file is part of libunwind. 62d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 72d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidmPermission is hereby granted, free of charge, to any person obtaining 82d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidma copy of this software and associated documentation files (the 92d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm"Software"), to deal in the Software without restriction, including 102d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidmwithout limitation the rights to use, copy, modify, merge, publish, 112d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidmdistribute, sublicense, and/or sell copies of the Software, and to 122d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidmpermit persons to whom the Software is furnished to do so, subject to 132d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidmthe following conditions: 142d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 152d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidmThe above copyright notice and this permission notice shall be 162d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidmincluded in all copies or substantial portions of the Software. 172d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 182d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 192d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 202d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 212d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 222d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 232d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 242d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 252d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 262d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm#ifndef mempool_h 272d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm#define mempool_h 282d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 292d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm/* Memory pools provide simple memory management of fixed-size 302d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm objects. Memory pools are used for two purposes: 312d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 322d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm o To ensure a stack can be unwound even when a process 332d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm is out of memory. 342d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 352d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm o To ensure a stack can be unwound at any time in a 362d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm multi-threaded process (e.g., even at a time when the normal 372d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm malloc-lock is taken, possibly by the very thread that is 382d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm being unwind). 392d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 402d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 412d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm To achieve the second objective, memory pools allocate memory 422d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm directly via mmap() system call (or an equivalent facility). 432d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 442d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm The first objective is accomplished by reserving memory ahead of 452d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm time. Since the memory requirements of stack unwinding generally 462d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm depends on the complexity of the procedures being unwind, there is 472d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm no absolute guarantee that unwinding will always work, but in 482d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm practice, this should not be a serious problem. */ 492d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 502d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm#include <sys/types.h> 512d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 525724bee8c27219ac277ea76d75dc70fa830eaac0hp.com!davidm#include "libunwind_i.h" 535daa8619b7e83ab4650efb7dc7cae793f444aedcmostang.com!davidm 545daa8619b7e83ab4650efb7dc7cae793f444aedcmostang.com!davidm#define sos_alloc(s) UNWI_ARCH_OBJ(_sos_alloc)(s) 555daa8619b7e83ab4650efb7dc7cae793f444aedcmostang.com!davidm#define mempool_init(p,s,r) UNWI_ARCH_OBJ(_mempool_init)(p,s,r) 565daa8619b7e83ab4650efb7dc7cae793f444aedcmostang.com!davidm#define mempool_alloc(p) UNWI_ARCH_OBJ(_mempool_alloc)(p) 575daa8619b7e83ab4650efb7dc7cae793f444aedcmostang.com!davidm#define mempool_free(p,o) UNWI_ARCH_OBJ(_mempool_free)(p,o) 582d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 592d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm/* The mempool structure should be treated as an opaque object. It's 602d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm declared here only to enable static allocation of mempools. */ 612d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidmstruct mempool 622d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm { 635daa8619b7e83ab4650efb7dc7cae793f444aedcmostang.com!davidm pthread_mutex_t lock; 642d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm size_t obj_size; /* object size (rounded up for alignment) */ 652d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm size_t chunk_size; /* allocation granularity */ 66195eb642851e2d6d81e3638248878caf49fcae6dmostang.com!davidm unsigned int reserve; /* minimum (desired) size of the free-list */ 672d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm unsigned int num_free; /* number of objects on the free-list */ 682d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm struct object 692d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm { 702d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm struct object *next; 712d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm } 722d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm *free_list; 732d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm }; 742d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 752d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm/* Emergency allocation for one-time stuff that doesn't fit the memory 765daa8619b7e83ab4650efb7dc7cae793f444aedcmostang.com!davidm pool model. A limited amount of memory is available in this 775daa8619b7e83ab4650efb7dc7cae793f444aedcmostang.com!davidm fashion and once allocated, there is no way to free it. */ 78b9d2cc7919cf343596fd007506492621311b1c43mostang.com!davidmextern void *sos_alloc (size_t size); 792d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 802d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm/* Initialize POOL for an object size of OBJECT_SIZE bytes. RESERVE 812d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm is the number of objects that should be reserved for use under 822d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm tight memory situations. If it is zero, mempool attempts to pick a 832d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm reasonable default value. */ 84b9d2cc7919cf343596fd007506492621311b1c43mostang.com!davidmextern void mempool_init (struct mempool *pool, 852d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm size_t obj_size, size_t reserve); 86b9d2cc7919cf343596fd007506492621311b1c43mostang.com!davidmextern void *mempool_alloc (struct mempool *pool); 87b9d2cc7919cf343596fd007506492621311b1c43mostang.com!davidmextern void mempool_free (struct mempool *pool, void *object); 882d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm 892d80409b226afeaff1bf69e3e18ab83f5e0eaf1fmostang.com!davidm#endif /* mempool_h */ 90