Home | History | Annotate | Download | only in microhttpd
      1 /*
      2      This file is part of libmicrohttpd
      3      Copyright (C) 2007, 2009 Daniel Pittman and Christian Grothoff
      4 
      5      This library is free software; you can redistribute it and/or
      6      modify it under the terms of the GNU Lesser General Public
      7      License as published by the Free Software Foundation; either
      8      version 2.1 of the License, or (at your option) any later version.
      9 
     10      This library is distributed in the hope that it will be useful,
     11      but WITHOUT ANY WARRANTY; without even the implied warranty of
     12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13      Lesser General Public License for more details.
     14 
     15      You should have received a copy of the GNU Lesser General Public
     16      License along with this library; if not, write to the Free Software
     17      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     18 */
     19 
     20 /**
     21  * @file memorypool.h
     22  * @brief memory pool; mostly used for efficient (de)allocation
     23  *        for each connection and bounding memory use for each
     24  *        request
     25  * @author Christian Grothoff
     26  */
     27 
     28 #ifndef MEMORYPOOL_H
     29 #define MEMORYPOOL_H
     30 
     31 #include "internal.h"
     32 
     33 /**
     34  * Opaque handle for a memory pool.
     35  * Pools are not reentrant and must not be used
     36  * by multiple threads.
     37  */
     38 struct MemoryPool;
     39 
     40 
     41 /**
     42  * Create a memory pool.
     43  *
     44  * @param max maximum size of the pool
     45  * @return NULL on error
     46  */
     47 struct MemoryPool *
     48 MHD_pool_create (size_t max);
     49 
     50 
     51 /**
     52  * Destroy a memory pool.
     53  *
     54  * @param pool memory pool to destroy
     55  */
     56 void
     57 MHD_pool_destroy (struct MemoryPool *pool);
     58 
     59 
     60 /**
     61  * Allocate size bytes from the pool.
     62  *
     63  * @param pool memory pool to use for the operation
     64  * @param size number of bytes to allocate
     65  * @param from_end allocate from end of pool (set to MHD_YES);
     66  *        use this for small, persistent allocations that
     67  *        will never be reallocated
     68  * @return NULL if the pool cannot support size more
     69  *         bytes
     70  */
     71 void *
     72 MHD_pool_allocate (struct MemoryPool *pool,
     73 		   size_t size, int from_end);
     74 
     75 
     76 /**
     77  * Reallocate a block of memory obtained from the pool.
     78  * This is particularly efficient when growing or
     79  * shrinking the block that was last (re)allocated.
     80  * If the given block is not the most recenlty
     81  * (re)allocated block, the memory of the previous
     82  * allocation may be leaked until the pool is
     83  * destroyed (and copying the data maybe required).
     84  *
     85  * @param pool memory pool to use for the operation
     86  * @param old the existing block
     87  * @param old_size the size of the existing block
     88  * @param new_size the new size of the block
     89  * @return new address of the block, or
     90  *         NULL if the pool cannot support new_size
     91  *         bytes (old continues to be valid for old_size)
     92  */
     93 void *
     94 MHD_pool_reallocate (struct MemoryPool *pool,
     95 		     void *old,
     96 		     size_t old_size,
     97 		     size_t new_size);
     98 
     99 
    100 /**
    101  * Clear all entries from the memory pool except
    102  * for "keep" of the given "size".
    103  *
    104  * @param pool memory pool to use for the operation
    105  * @param keep pointer to the entry to keep (maybe NULL)
    106  * @param size how many bytes need to be kept at this address
    107  * @return addr new address of "keep" (if it had to change)
    108  */
    109 void *
    110 MHD_pool_reset (struct MemoryPool *pool,
    111 		void *keep,
    112 		size_t size);
    113 
    114 #endif
    115