summaryrefslogtreecommitdiffstats
path: root/contrib/sendmail/include/sm/rpool.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/sendmail/include/sm/rpool.h')
-rw-r--r--contrib/sendmail/include/sm/rpool.h185
1 files changed, 185 insertions, 0 deletions
diff --git a/contrib/sendmail/include/sm/rpool.h b/contrib/sendmail/include/sm/rpool.h
new file mode 100644
index 0000000..e750fcb
--- /dev/null
+++ b/contrib/sendmail/include/sm/rpool.h
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
+ * All rights reserved.
+ *
+ * By using this file, you agree to the terms and conditions set
+ * forth in the LICENSE file which can be found at the top level of
+ * the sendmail distribution.
+ *
+ * $Id: rpool.h,v 1.15 2001/09/04 22:41:55 ca Exp $
+ */
+
+/*
+** libsm resource pools
+** See libsm/rpool.html for documentation.
+*/
+
+#ifndef SM_RPOOL_H
+# define SM_RPOOL_H
+
+# include <sm/gen.h>
+# include <sm/heap.h>
+# include <sm/string.h>
+
+/*
+** Each memory pool object consists of an SM_POOLLINK_T,
+** followed by a platform specific amount of padding,
+** followed by 'poolsize' bytes of pool data,
+** where 'poolsize' is the value of rpool->sm_poolsize at the time
+** the pool is allocated.
+*/
+
+typedef struct sm_poollink SM_POOLLINK_T;
+struct sm_poollink
+{
+ SM_POOLLINK_T *sm_pnext;
+};
+
+typedef void (*SM_RPOOL_RFREE_T) __P((void *_rcontext));
+
+typedef SM_RPOOL_RFREE_T *SM_RPOOL_ATTACH_T;
+
+typedef struct sm_resource SM_RESOURCE_T;
+struct sm_resource
+{
+ /*
+ ** Function for freeing this resource. It may be NULL,
+ ** meaning that this resource has already been freed.
+ */
+
+ SM_RPOOL_RFREE_T sm_rfree;
+ void *sm_rcontext; /* resource data */
+};
+
+# define SM_RLIST_MAX 511
+
+typedef struct sm_rlist SM_RLIST_T;
+struct sm_rlist
+{
+ SM_RESOURCE_T sm_rvec[SM_RLIST_MAX];
+ SM_RLIST_T *sm_rnext;
+};
+
+typedef struct
+{
+ /* Points to SmRpoolMagic, or is NULL if rpool is freed. */
+ const char *sm_magic;
+
+ /*
+ ** If this rpool object has no parent, then sm_parentlink
+ ** is NULL. Otherwise, we set *sm_parentlink = NULL
+ ** when this rpool is freed, so that it isn't freed a
+ ** second time when the parent is freed.
+ */
+
+ SM_RPOOL_RFREE_T *sm_parentlink;
+
+ /*
+ ** Memory pools
+ */
+
+ /* Size of the next pool to be allocated, not including the header. */
+ size_t sm_poolsize;
+
+ /*
+ ** If an sm_rpool_malloc_x request is too big to fit
+ ** in the current pool, and the request size > bigobjectsize,
+ ** then the object will be given its own malloc'ed block.
+ ** sm_bigobjectsize <= sm_poolsize. The maximum wasted space
+ ** at the end of a pool is maxpooledobjectsize - 1.
+ */
+
+ size_t sm_bigobjectsize;
+
+ /* Points to next free byte in the current pool. */
+ char *sm_poolptr;
+
+ /*
+ ** Number of bytes available in the current pool.
+ ** Initially 0. Set to 0 by sm_rpool_free.
+ */
+
+ size_t sm_poolavail;
+
+ /* Linked list of memory pools. Initially NULL. */
+ SM_POOLLINK_T *sm_pools;
+
+ /*
+ ** Resource lists
+ */
+
+ SM_RESOURCE_T *sm_rptr; /* Points to next free resource slot. */
+
+ /*
+ ** Number of available resource slots in current list.
+ ** Initially 0. Set to 0 by sm_rpool_free.
+ */
+
+ size_t sm_ravail;
+
+ /* Linked list of resource lists. Initially NULL. */
+ SM_RLIST_T *sm_rlists;
+
+#if _FFR_PERF_RPOOL
+ int sm_nbigblocks;
+ int sm_npools;
+#endif /* _FFR_PERF_RPOOL */
+
+} SM_RPOOL_T;
+
+extern SM_RPOOL_T *
+sm_rpool_new_x __P((
+ SM_RPOOL_T *_parent));
+
+extern void
+sm_rpool_free __P((
+ SM_RPOOL_T *_rpool));
+
+# if SM_HEAP_CHECK
+extern void *
+sm_rpool_malloc_tagged_x __P((
+ SM_RPOOL_T *_rpool,
+ size_t _size,
+ char *_file,
+ int _line,
+ int _group));
+# define sm_rpool_malloc_x(rpool, size) \
+ sm_rpool_malloc_tagged_x(rpool, size, __FILE__, __LINE__, SmHeapGroup)
+extern void *
+sm_rpool_malloc_tagged __P((
+ SM_RPOOL_T *_rpool,
+ size_t _size,
+ char *_file,
+ int _line,
+ int _group));
+# define sm_rpool_malloc(rpool, size) \
+ sm_rpool_malloc_tagged(rpool, size, __FILE__, __LINE__, SmHeapGroup)
+# else /* SM_HEAP_CHECK */
+extern void *
+sm_rpool_malloc_x __P((
+ SM_RPOOL_T *_rpool,
+ size_t _size));
+extern void *
+sm_rpool_malloc __P((
+ SM_RPOOL_T *_rpool,
+ size_t _size));
+# endif /* SM_HEAP_CHECK */
+
+# define sm_rpool_strdup_x(rpool, str) \
+ strcpy(sm_rpool_malloc_x(rpool, strlen(str) + 1), str)
+
+extern SM_RPOOL_ATTACH_T
+sm_rpool_attach_x __P((
+ SM_RPOOL_T *_rpool,
+ SM_RPOOL_RFREE_T _rfree,
+ void *_rcontext));
+
+# define sm_rpool_detach(a) ((void)(*(a) = NULL))
+
+extern void
+sm_rpool_setsizes __P((
+ SM_RPOOL_T *_rpool,
+ size_t _poolsize,
+ size_t _bigobjectsize));
+
+#endif /* ! SM_RPOOL_H */
OpenPOWER on IntegriCloud