1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/cx/mempool.h Wed Aug 03 17:27:55 2022 +0200 1.3 @@ -0,0 +1,121 @@ 1.4 +/* 1.5 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 1.6 + * 1.7 + * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved. 1.8 + * 1.9 + * Redistribution and use in source and binary forms, with or without 1.10 + * modification, are permitted provided that the following conditions are met: 1.11 + * 1.12 + * 1. Redistributions of source code must retain the above copyright 1.13 + * notice, this list of conditions and the following disclaimer. 1.14 + * 1.15 + * 2. Redistributions in binary form must reproduce the above copyright 1.16 + * notice, this list of conditions and the following disclaimer in the 1.17 + * documentation and/or other materials provided with the distribution. 1.18 + * 1.19 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1.20 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1.21 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1.22 + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 1.23 + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1.24 + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1.25 + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 1.26 + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 1.27 + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 1.28 + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 1.29 + * POSSIBILITY OF SUCH DAMAGE. 1.30 + */ 1.31 +/** 1.32 + * \file mempool.h 1.33 + * \brief Interface for memory pool implementations. 1.34 + * \author Mike Becker 1.35 + * \author Olaf Wintermann 1.36 + * \version 3.0 1.37 + * \copyright 2-Clause BSD License 1.38 + */ 1.39 + 1.40 +#ifndef UCX_MEMPOOL_H 1.41 +#define UCX_MEMPOOL_H 1.42 + 1.43 +#include "allocator.h" 1.44 + 1.45 +#ifdef __cplusplus 1.46 +extern "C" { 1.47 +#endif 1.48 + 1.49 +/** 1.50 + * Memory pool class type. 1.51 + */ 1.52 +typedef struct cx_mempool_class_s cx_mempool_class; 1.53 + 1.54 +/** 1.55 + * The basic structure of a memory pool. 1.56 + * Should be the first member of an actual memory pool implementation. 1.57 + */ 1.58 +struct cx_mempool_s { 1.59 + /** 1.60 + * The pool class definition. 1.61 + */ 1.62 + cx_mempool_class *cl; 1.63 + /** 1.64 + * The provided allocator. 1.65 + */ 1.66 + CxAllocator const *allocator; 1.67 +}; 1.68 + 1.69 +/** 1.70 + * Common type for all memory pool implementations. 1.71 + */ 1.72 +typedef struct cx_mempool_s CxMempool; 1.73 + 1.74 +/** 1.75 + * The class definition for a memory pool. 1.76 + */ 1.77 +struct cx_mempool_class_s { 1.78 + /** Member function for destroying the pool. */ 1.79 + __attribute__((__nonnull__)) 1.80 + void (*destroy)(CxMempool *pool); 1.81 + 1.82 + /** Member function for setting a destructor. */ 1.83 + __attribute__((__nonnull__)) 1.84 + void (*set_destructor)( 1.85 + CxMempool *pool, 1.86 + void *memory, 1.87 + cx_destructor_func fnc 1.88 + ); 1.89 +}; 1.90 + 1.91 + 1.92 +/** 1.93 + * Destroys a memory pool including their contents. 1.94 + * 1.95 + * @param pool the memory pool to destroy 1.96 + */ 1.97 +__attribute__((__nonnull__)) 1.98 +static inline void cxMempoolDestroy(CxMempool *pool) { 1.99 + pool->cl->destroy(pool); 1.100 +} 1.101 + 1.102 +/** 1.103 + * Sets a destructor function for an allocated memory object. 1.104 + * 1.105 + * If the memory is not managed by the pool, the behavior is undefined. 1.106 + * 1.107 + * @param pool the pool 1.108 + * @param memory the objected allocated in the pool 1.109 + * @param fnc the destructor function 1.110 + */ 1.111 +__attribute__((__nonnull__)) 1.112 +static inline void cxMempoolSetDestructor( 1.113 + CxMempool *pool, 1.114 + void *memory, 1.115 + cx_destructor_func fnc 1.116 +) { 1.117 + pool->cl->set_destructor(pool, memory, fnc); 1.118 +} 1.119 + 1.120 +#ifdef __cplusplus 1.121 +} // extern "C" 1.122 +#endif 1.123 + 1.124 +#endif // UCX_MEMPOOL_H