xref: /freebsd/contrib/sendmail/include/sm/rpool.h (revision d39bd2c1388b520fcba9abed1932acacead60fba)
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