/*
* Copyright (c) 2000-2003 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.26 2005/06/16 00:09:34 ca Exp $
*/
/*
** Resource pools
** See rpool.html for documentation.
*/
#ifndef SM_RPOOL_H
#define SM_RPOOL_H 1
#include "sm/generic.h"
#include "sm/magic.h"
#include "sm/string.h"
#include "sm/heap.h"
typedef void (*sm_rp_rsrcfree_T)(void *_rcontext);
typedef sm_rp_rsrcfree_T *sm_rpool_attach_T;
typedef struct sm_rpool_S *sm_rpool_P;
typedef struct sm_rpool_S sm_rpool_T;
/* only free non-rpool allocated memory */
#define sm_rpool_free(rpool, ptr) do \
{ \
if ((rpool) == NULL) \
sm_free(ptr); \
} while (0)
#define sm_rpool_free_size(rpool, ptr, size) do \
{ \
if ((rpool) == NULL) \
sm_free_size((ptr), (size)); \
} while (0)
#define SM_RPOOL_FREE(rpool, ptr) do \
{ \
if ((ptr) != NULL) \
{ \
if ((rpool) == NULL) \
sm_free(ptr); \
(ptr) = NULL; \
} \
} while (0)
#define SM_RPOOL_FREE_SIZE(rpool, ptr, size) do \
{ \
if ((ptr) != NULL) \
{ \
if ((rpool) == NULL) \
sm_free_size((ptr), (size)); \
(ptr) = NULL; \
} \
} while (0)
/* function declarations */
sm_rpool_P sm_rpool_new(sm_rpool_P _parent);
void sm_rpool_delete(sm_rpool_P _rpool);
#if SM_HEAP_CHECK
void *sm_rpool_malloc_tagged(sm_rpool_P _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)
void *sm_rpool_zalloc_tagged(sm_rpool_P _rpool,
size_t _size,
char *_file,
int _line,
int _group);
# define sm_rpool_zalloc(rpool, size) \
sm_rpool_zalloc_tagged(rpool, size, __FILE__, __LINE__, SmHeapGroup)
void *sm_rpool_realloc_tagged(sm_rpool_P _rpool,
void *_oldptr, size_t _oldsize, size_t _newsize,
char *_file, int _line, int _group);
# define sm_rpool_realloc(rpool, oldptr, oldsize, newsize) \
sm_rpool_realloc_tagged(rpool, oldptr, oldsize, newsize, \
__FILE__, __LINE__, SmHeapGroup)
#else /* SM_HEAP_CHECK */
# define sm_rpool_malloc_tagged(rpool, size, file, line, grp) \
sm_rpool_malloc(rpool, size)
# define sm_rpool_zalloc_tagged(rpool, size, file, line, grp) \
sm_rpool_zalloc(rpool, size)
# define sm_rpool_realloc_tagged(rpool, ptr, size, file, line, grp) \
sm_rpool_realloc(rpool, ptr, size)
void *sm_rpool_malloc(sm_rpool_P _rpool, size_t _size);
void *sm_rpool_zalloc(sm_rpool_P _rpool, size_t _size);
void *sm_rpool_realloc(sm_rpool_P _rpool, void *_oldptr,
size_t _oldsize, size_t _newsize);
#endif /* SM_HEAP_CHECK */
char *sm_rpool_strdup(sm_rpool_P _rpool, const char *_str);
void *sm_rpool_memdup(sm_rpool_P _rpool, const void *_ptr, size_t _l);
#if 0
/* allow str to be NULL */
#define SM_RPOOL_STRDUP_NULL_X(rpool, str) \
((str) == NULL) ? NULL : sm_rpool_strdup_x((rpool), (str))
#endif
sm_rpool_attach_T sm_rpool_attach(sm_rpool_P _rpool,
sm_rp_rsrcfree_T _rfree,
void *_rcontext);
#define sm_rpool_detach(a) ((void)(*(a) = NULL))
void sm_rpool_setsizes(sm_rpool_P _rpool,
size_t _poolsize,
size_t _bigobjectsize,
size_t _maxsize);
#endif /* ! SM_RPOOL_H */
syntax highlighted by Code2HTML, v. 0.9.1