| 1 | /* |
| 2 | Copyright (c) 2012, Broadcom Europe Ltd |
| 3 | All rights reserved. |
| 4 | |
| 5 | Redistribution and use in source and binary forms, with or without |
| 6 | modification, are permitted provided that the following conditions are met: |
| 7 | * Redistributions of source code must retain the above copyright |
| 8 | notice, this list of conditions and the following disclaimer. |
| 9 | * Redistributions in binary form must reproduce the above copyright |
| 10 | notice, this list of conditions and the following disclaimer in the |
| 11 | documentation and/or other materials provided with the distribution. |
| 12 | * Neither the name of the copyright holder nor the |
| 13 | names of its contributors may be used to endorse or promote products |
| 14 | derived from this software without specific prior written permission. |
| 15 | |
| 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
| 17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| 18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY |
| 20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| 21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| 22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| 23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 26 | */ |
| 27 | |
| 28 | #ifndef MMAL_POOL_H |
| 29 | #define MMAL_POOL_H |
| 30 | |
| 31 | #ifdef __cplusplus |
| 32 | extern "C" { |
| 33 | #endif |
| 34 | |
| 35 | /** \defgroup MmalPool Pools of buffer headers |
| 36 | * A pool of buffer headers is composed of a queue (\ref MMAL_QUEUE_T) and a user |
| 37 | * specified number of buffer headers (\ref MMAL_BUFFER_HEADER_T). */ |
| 38 | /* @{ */ |
| 39 | |
| 40 | #include "mmal_queue.h" |
| 41 | |
| 42 | /** Definition of a pool */ |
| 43 | typedef struct MMAL_POOL_T |
| 44 | { |
| 45 | MMAL_QUEUE_T *queue; /**< Queue used by the pool */ |
| 46 | uint32_t ; /**< Number of buffer headers in the pool */ |
| 47 | MMAL_BUFFER_HEADER_T **; /**< Array of buffer headers belonging to the pool */ |
| 48 | } MMAL_POOL_T; |
| 49 | |
| 50 | /** Allocator alloc prototype |
| 51 | * |
| 52 | * @param context The context pointer passed in on pool creation. |
| 53 | * @param size The size of the allocation required, in bytes. |
| 54 | * @return The pointer to the newly allocated memory, or NULL on failure. |
| 55 | */ |
| 56 | typedef void *(*mmal_pool_allocator_alloc_t)(void *context, uint32_t size); |
| 57 | /** Allocator free prototype |
| 58 | * |
| 59 | * @param context The context pointer passed in on pool creation. |
| 60 | * @param mem The pointer to the memory to be released. |
| 61 | */ |
| 62 | typedef void (*mmal_pool_allocator_free_t)(void *context, void *mem); |
| 63 | |
| 64 | /** Create a pool of MMAL_BUFFER_HEADER_T. |
| 65 | * After allocation, all allocated buffer headers will have been added to the queue. |
| 66 | * |
| 67 | * It is valid to create a pool with no buffer headers, or with zero size payload buffers. |
| 68 | * The mmal_pool_resize() function can be used to increase or decrease the number of buffer |
| 69 | * headers, or the size of the payload buffers, after creation of the pool. |
| 70 | * |
| 71 | * The payload buffers may also be allocated independently by the client, and assigned |
| 72 | * to the buffer headers, but it will be the responsibility of the client to deal with |
| 73 | * resizing and releasing the memory. It is recommended that mmal_pool_create_with_allocator() |
| 74 | * is used in this case, supplying allocator function pointers that will be used as |
| 75 | * necessary by MMAL. |
| 76 | * |
| 77 | * @param headers Number of buffer headers to be allocated with the pool. |
| 78 | * @param payload_size Size of the payload buffer that will be allocated in |
| 79 | * each of the buffer headers. |
| 80 | * @return Pointer to the newly created pool or NULL on failure. |
| 81 | */ |
| 82 | MMAL_POOL_T *mmal_pool_create(unsigned int , uint32_t payload_size); |
| 83 | |
| 84 | /** Create a pool of MMAL_BUFFER_HEADER_T. |
| 85 | * After allocation, all allocated buffer headers will have been added to the queue. |
| 86 | * |
| 87 | * It is valid to create a pool with no buffer headers, or with zero size payload buffers. |
| 88 | * The mmal_pool_resize() function can be used to increase or decrease the number of buffer |
| 89 | * headers, or the size of the payload buffers, after creation of the pool. The allocators |
| 90 | * passed during creation shall be used when resizing the payload buffers. |
| 91 | * |
| 92 | * @param headers Number of buffer headers to be allocated with the pool. |
| 93 | * @param payload_size Size of the payload buffer that will be allocated in |
| 94 | * each of the buffer headers. |
| 95 | * @param allocator_context Pointer to the context of the allocator. |
| 96 | * @param allocator_alloc Function pointer for the alloc call of the allocator. |
| 97 | * @param allocator_free Function pointer for the free call of the allocator. |
| 98 | * |
| 99 | * @return Pointer to the newly created pool or NULL on failure. |
| 100 | */ |
| 101 | MMAL_POOL_T *mmal_pool_create_with_allocator(unsigned int , uint32_t payload_size, |
| 102 | void *allocator_context, mmal_pool_allocator_alloc_t allocator_alloc, |
| 103 | mmal_pool_allocator_free_t allocator_free); |
| 104 | |
| 105 | /** Destroy a pool of MMAL_BUFFER_HEADER_T. |
| 106 | * This will also deallocate all of the memory which was allocated when creating or |
| 107 | * resizing the pool. |
| 108 | * |
| 109 | * If payload buffers have been allocated independently by the client, they should be |
| 110 | * released prior to calling this function. If the client provided allocator functions, |
| 111 | * the allocator_free function shall be called for each payload buffer. |
| 112 | * |
| 113 | * @param pool Pointer to a pool |
| 114 | */ |
| 115 | void mmal_pool_destroy(MMAL_POOL_T *pool); |
| 116 | |
| 117 | /** Resize a pool of MMAL_BUFFER_HEADER_T. |
| 118 | * This allows modifying either the number of allocated buffers, the payload size or both at the |
| 119 | * same time. |
| 120 | * |
| 121 | * @param pool Pointer to the pool |
| 122 | * @param headers New number of buffer headers to be allocated in the pool. |
| 123 | * It is not valid to pass zero for the number of buffers. |
| 124 | * @param payload_size Size of the payload buffer that will be allocated in |
| 125 | * each of the buffer headers. |
| 126 | * If this is set to 0, all payload buffers shall be released. |
| 127 | * @return MMAL_SUCCESS or an error on failure. |
| 128 | */ |
| 129 | MMAL_STATUS_T mmal_pool_resize(MMAL_POOL_T *pool, unsigned int , uint32_t payload_size); |
| 130 | |
| 131 | /** Definition of the callback used by a pool to signal back to the user that a buffer header |
| 132 | * has been released back to the pool. |
| 133 | * |
| 134 | * @param pool Pointer to the pool |
| 135 | * @param buffer Buffer header just released |
| 136 | * @param userdata User specific data passed in when setting the callback |
| 137 | * @return True to have the buffer header put back in the pool's queue, false if the buffer |
| 138 | * header has been taken within the callback. |
| 139 | */ |
| 140 | typedef MMAL_BOOL_T (*MMAL_POOL_BH_CB_T)(MMAL_POOL_T *pool, MMAL_BUFFER_HEADER_T *buffer, void *userdata); |
| 141 | |
| 142 | /** Set a buffer header release callback to the pool. |
| 143 | * Each time a buffer header is released to the pool, the callback will be triggered. |
| 144 | * |
| 145 | * @param pool Pointer to a pool |
| 146 | * @param cb Callback function |
| 147 | * @param userdata User specific data which will be passed with each callback |
| 148 | */ |
| 149 | void mmal_pool_callback_set(MMAL_POOL_T *pool, MMAL_POOL_BH_CB_T cb, void *userdata); |
| 150 | |
| 151 | /** Set a pre-release callback for all buffer headers in the pool. |
| 152 | * Each time a buffer header is about to be released to the pool, the callback |
| 153 | * will be triggered. |
| 154 | * |
| 155 | * @param pool Pointer to the pool |
| 156 | * @param cb Pre-release callback function |
| 157 | * @param userdata User-specific data passed back with each callback |
| 158 | */ |
| 159 | void mmal_pool_pre_release_callback_set(MMAL_POOL_T *pool, MMAL_BH_PRE_RELEASE_CB_T cb, void *userdata); |
| 160 | |
| 161 | /* @} */ |
| 162 | |
| 163 | #ifdef __cplusplus |
| 164 | } |
| 165 | #endif |
| 166 | |
| 167 | #endif /* MMAL_POOL_H */ |
| 168 | |