140266059SGregory Neil Shapiro /* 25dd76dd0SGregory Neil Shapiro * Copyright (c) 2000-2001, 2003 Proofpoint, Inc. and its suppliers. 340266059SGregory Neil Shapiro * All rights reserved. 440266059SGregory Neil Shapiro * 540266059SGregory Neil Shapiro * By using this file, you agree to the terms and conditions set 640266059SGregory Neil Shapiro * forth in the LICENSE file which can be found at the top level of 740266059SGregory Neil Shapiro * the sendmail distribution. 840266059SGregory Neil Shapiro * 94313cc83SGregory Neil Shapiro * $Id: rpool.h,v 1.17 2013-11-22 20:51:31 ca Exp $ 1040266059SGregory Neil Shapiro */ 1140266059SGregory Neil Shapiro 1240266059SGregory Neil Shapiro /* 1340266059SGregory Neil Shapiro ** libsm resource pools 1440266059SGregory Neil Shapiro ** See libsm/rpool.html for documentation. 1540266059SGregory Neil Shapiro */ 1640266059SGregory Neil Shapiro 1740266059SGregory Neil Shapiro #ifndef SM_RPOOL_H 182fb4f839SGregory Neil Shapiro # define SM_RPOOL_H 1 1940266059SGregory Neil Shapiro 2040266059SGregory Neil Shapiro # include <sm/gen.h> 2140266059SGregory Neil Shapiro # include <sm/heap.h> 2240266059SGregory Neil Shapiro # include <sm/string.h> 2340266059SGregory Neil Shapiro 2440266059SGregory Neil Shapiro /* 2540266059SGregory Neil Shapiro ** Each memory pool object consists of an SM_POOLLINK_T, 2640266059SGregory Neil Shapiro ** followed by a platform specific amount of padding, 2740266059SGregory Neil Shapiro ** followed by 'poolsize' bytes of pool data, 2840266059SGregory Neil Shapiro ** where 'poolsize' is the value of rpool->sm_poolsize at the time 2940266059SGregory Neil Shapiro ** the pool is allocated. 3040266059SGregory Neil Shapiro */ 3140266059SGregory Neil Shapiro 3240266059SGregory Neil Shapiro typedef struct sm_poollink SM_POOLLINK_T; 3340266059SGregory Neil Shapiro struct sm_poollink 3440266059SGregory Neil Shapiro { 3540266059SGregory Neil Shapiro SM_POOLLINK_T *sm_pnext; 3640266059SGregory Neil Shapiro }; 3740266059SGregory Neil Shapiro 3840266059SGregory Neil Shapiro typedef void (*SM_RPOOL_RFREE_T) __P((void *_rcontext)); 3940266059SGregory Neil Shapiro 4040266059SGregory Neil Shapiro typedef SM_RPOOL_RFREE_T *SM_RPOOL_ATTACH_T; 4140266059SGregory Neil Shapiro 4240266059SGregory Neil Shapiro typedef struct sm_resource SM_RESOURCE_T; 4340266059SGregory Neil Shapiro struct sm_resource 4440266059SGregory Neil Shapiro { 4540266059SGregory Neil Shapiro /* 4640266059SGregory Neil Shapiro ** Function for freeing this resource. It may be NULL, 4740266059SGregory Neil Shapiro ** meaning that this resource has already been freed. 4840266059SGregory Neil Shapiro */ 4940266059SGregory Neil Shapiro 5040266059SGregory Neil Shapiro SM_RPOOL_RFREE_T sm_rfree; 5140266059SGregory Neil Shapiro void *sm_rcontext; /* resource data */ 5240266059SGregory Neil Shapiro }; 5340266059SGregory Neil Shapiro 5440266059SGregory Neil Shapiro # define SM_RLIST_MAX 511 5540266059SGregory Neil Shapiro 5640266059SGregory Neil Shapiro typedef struct sm_rlist SM_RLIST_T; 5740266059SGregory Neil Shapiro struct sm_rlist 5840266059SGregory Neil Shapiro { 5940266059SGregory Neil Shapiro SM_RESOURCE_T sm_rvec[SM_RLIST_MAX]; 6040266059SGregory Neil Shapiro SM_RLIST_T *sm_rnext; 6140266059SGregory Neil Shapiro }; 6240266059SGregory Neil Shapiro 6340266059SGregory Neil Shapiro typedef struct 6440266059SGregory Neil Shapiro { 6540266059SGregory Neil Shapiro /* Points to SmRpoolMagic, or is NULL if rpool is freed. */ 6640266059SGregory Neil Shapiro const char *sm_magic; 6740266059SGregory Neil Shapiro 6840266059SGregory Neil Shapiro /* 6940266059SGregory Neil Shapiro ** If this rpool object has no parent, then sm_parentlink 7040266059SGregory Neil Shapiro ** is NULL. Otherwise, we set *sm_parentlink = NULL 7140266059SGregory Neil Shapiro ** when this rpool is freed, so that it isn't freed a 7240266059SGregory Neil Shapiro ** second time when the parent is freed. 7340266059SGregory Neil Shapiro */ 7440266059SGregory Neil Shapiro 7540266059SGregory Neil Shapiro SM_RPOOL_RFREE_T *sm_parentlink; 7640266059SGregory Neil Shapiro 7740266059SGregory Neil Shapiro /* 7840266059SGregory Neil Shapiro ** Memory pools 7940266059SGregory Neil Shapiro */ 8040266059SGregory Neil Shapiro 8140266059SGregory Neil Shapiro /* Size of the next pool to be allocated, not including the header. */ 8240266059SGregory Neil Shapiro size_t sm_poolsize; 8340266059SGregory Neil Shapiro 8440266059SGregory Neil Shapiro /* 8540266059SGregory Neil Shapiro ** If an sm_rpool_malloc_x request is too big to fit 8640266059SGregory Neil Shapiro ** in the current pool, and the request size > bigobjectsize, 8740266059SGregory Neil Shapiro ** then the object will be given its own malloc'ed block. 8840266059SGregory Neil Shapiro ** sm_bigobjectsize <= sm_poolsize. The maximum wasted space 8940266059SGregory Neil Shapiro ** at the end of a pool is maxpooledobjectsize - 1. 9040266059SGregory Neil Shapiro */ 9140266059SGregory Neil Shapiro 9240266059SGregory Neil Shapiro size_t sm_bigobjectsize; 9340266059SGregory Neil Shapiro 9440266059SGregory Neil Shapiro /* Points to next free byte in the current pool. */ 9540266059SGregory Neil Shapiro char *sm_poolptr; 9640266059SGregory Neil Shapiro 9740266059SGregory Neil Shapiro /* 9840266059SGregory Neil Shapiro ** Number of bytes available in the current pool. 9940266059SGregory Neil Shapiro ** Initially 0. Set to 0 by sm_rpool_free. 10040266059SGregory Neil Shapiro */ 10140266059SGregory Neil Shapiro 10240266059SGregory Neil Shapiro size_t sm_poolavail; 10340266059SGregory Neil Shapiro 10440266059SGregory Neil Shapiro /* Linked list of memory pools. Initially NULL. */ 10540266059SGregory Neil Shapiro SM_POOLLINK_T *sm_pools; 10640266059SGregory Neil Shapiro 10740266059SGregory Neil Shapiro /* 10840266059SGregory Neil Shapiro ** Resource lists 10940266059SGregory Neil Shapiro */ 11040266059SGregory Neil Shapiro 11140266059SGregory Neil Shapiro SM_RESOURCE_T *sm_rptr; /* Points to next free resource slot. */ 11240266059SGregory Neil Shapiro 11340266059SGregory Neil Shapiro /* 11440266059SGregory Neil Shapiro ** Number of available resource slots in current list. 11540266059SGregory Neil Shapiro ** Initially 0. Set to 0 by sm_rpool_free. 11640266059SGregory Neil Shapiro */ 11740266059SGregory Neil Shapiro 11840266059SGregory Neil Shapiro size_t sm_ravail; 11940266059SGregory Neil Shapiro 12040266059SGregory Neil Shapiro /* Linked list of resource lists. Initially NULL. */ 12140266059SGregory Neil Shapiro SM_RLIST_T *sm_rlists; 12240266059SGregory Neil Shapiro 12340266059SGregory Neil Shapiro #if _FFR_PERF_RPOOL 12440266059SGregory Neil Shapiro int sm_nbigblocks; 12540266059SGregory Neil Shapiro int sm_npools; 1265b0945b5SGregory Neil Shapiro #endif 12740266059SGregory Neil Shapiro 12840266059SGregory Neil Shapiro } SM_RPOOL_T; 12940266059SGregory Neil Shapiro 13040266059SGregory Neil Shapiro extern SM_RPOOL_T * 13140266059SGregory Neil Shapiro sm_rpool_new_x __P(( 13240266059SGregory Neil Shapiro SM_RPOOL_T *_parent)); 13340266059SGregory Neil Shapiro 13440266059SGregory Neil Shapiro extern void 13540266059SGregory Neil Shapiro sm_rpool_free __P(( 13640266059SGregory Neil Shapiro SM_RPOOL_T *_rpool)); 13740266059SGregory Neil Shapiro 13840266059SGregory Neil Shapiro # if SM_HEAP_CHECK 13940266059SGregory Neil Shapiro extern void * 14040266059SGregory Neil Shapiro sm_rpool_malloc_tagged_x __P(( 14140266059SGregory Neil Shapiro SM_RPOOL_T *_rpool, 14240266059SGregory Neil Shapiro size_t _size, 14340266059SGregory Neil Shapiro char *_file, 14440266059SGregory Neil Shapiro int _line, 14540266059SGregory Neil Shapiro int _group)); 14640266059SGregory Neil Shapiro # define sm_rpool_malloc_x(rpool, size) \ 14740266059SGregory Neil Shapiro sm_rpool_malloc_tagged_x(rpool, size, __FILE__, __LINE__, SmHeapGroup) 14840266059SGregory Neil Shapiro extern void * 14940266059SGregory Neil Shapiro sm_rpool_malloc_tagged __P(( 15040266059SGregory Neil Shapiro SM_RPOOL_T *_rpool, 15140266059SGregory Neil Shapiro size_t _size, 15240266059SGregory Neil Shapiro char *_file, 15340266059SGregory Neil Shapiro int _line, 15440266059SGregory Neil Shapiro int _group)); 15540266059SGregory Neil Shapiro # define sm_rpool_malloc(rpool, size) \ 15640266059SGregory Neil Shapiro sm_rpool_malloc_tagged(rpool, size, __FILE__, __LINE__, SmHeapGroup) 15740266059SGregory Neil Shapiro # else /* SM_HEAP_CHECK */ 15840266059SGregory Neil Shapiro extern void * 15940266059SGregory Neil Shapiro sm_rpool_malloc_x __P(( 16040266059SGregory Neil Shapiro SM_RPOOL_T *_rpool, 16140266059SGregory Neil Shapiro size_t _size)); 16240266059SGregory Neil Shapiro extern void * 16340266059SGregory Neil Shapiro sm_rpool_malloc __P(( 16440266059SGregory Neil Shapiro SM_RPOOL_T *_rpool, 16540266059SGregory Neil Shapiro size_t _size)); 166*d39bd2c1SGregory Neil Shapiro # define sm_rpool_malloc_tagged(rpool, size, file, line, group) sm_rpool_malloc(rpool, size) 167*d39bd2c1SGregory Neil Shapiro # define sm_rpool_malloc_tagged_x(rpool, size, file, line, group) sm_rpool_malloc_x(rpool, size) 16840266059SGregory Neil Shapiro # endif /* SM_HEAP_CHECK */ 16940266059SGregory Neil Shapiro 170e92d3f3fSGregory Neil Shapiro #if DO_NOT_USE_STRCPY 1712fb4f839SGregory Neil Shapiro 1722fb4f839SGregory Neil Shapiro # if SM_HEAP_CHECK > 2 1732fb4f839SGregory Neil Shapiro extern char *sm_rpool_strdup_tagged_x __P((SM_RPOOL_T *rpool, const char *s, char *, int, int)); 1742fb4f839SGregory Neil Shapiro # define sm_rpool_strdup_x(rpool, str) sm_rpool_strdup_tagged_x(rpool, str, "sm_rpool_strdup_x:" __FILE__, __LINE__, SmHeapGroup) 1752fb4f839SGregory Neil Shapiro # else 176e92d3f3fSGregory Neil Shapiro extern char *sm_rpool_strdup_x __P((SM_RPOOL_T *rpool, const char *s)); 1772fb4f839SGregory Neil Shapiro # define sm_rpool_strdup_tagged_x(rpool, str, tag, line, group) sm_rpool_strdup_x(rpool, str) 1782fb4f839SGregory Neil Shapiro # endif 1792fb4f839SGregory Neil Shapiro 1805b0945b5SGregory Neil Shapiro #else 18140266059SGregory Neil Shapiro # define sm_rpool_strdup_x(rpool, str) \ 18240266059SGregory Neil Shapiro strcpy(sm_rpool_malloc_x(rpool, strlen(str) + 1), str) 1835b0945b5SGregory Neil Shapiro #endif 18440266059SGregory Neil Shapiro 18540266059SGregory Neil Shapiro extern SM_RPOOL_ATTACH_T 18640266059SGregory Neil Shapiro sm_rpool_attach_x __P(( 18740266059SGregory Neil Shapiro SM_RPOOL_T *_rpool, 18840266059SGregory Neil Shapiro SM_RPOOL_RFREE_T _rfree, 18940266059SGregory Neil Shapiro void *_rcontext)); 19040266059SGregory Neil Shapiro 19140266059SGregory Neil Shapiro # define sm_rpool_detach(a) ((void)(*(a) = NULL)) 19240266059SGregory Neil Shapiro 19340266059SGregory Neil Shapiro extern void 19440266059SGregory Neil Shapiro sm_rpool_setsizes __P(( 19540266059SGregory Neil Shapiro SM_RPOOL_T *_rpool, 19640266059SGregory Neil Shapiro size_t _poolsize, 19740266059SGregory Neil Shapiro size_t _bigobjectsize)); 19840266059SGregory Neil Shapiro 19940266059SGregory Neil Shapiro #endif /* ! SM_RPOOL_H */ 200