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