1 /*
2   LV2 realtime safe memory pool extension definition
3   This work is in public domain.
4 
5   This file is distributed in the hope that it will be useful,
6   but WITHOUT ANY WARRANTY; without even the implied warranty of
7   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
8 
9   If you have questions, contact Filipe Coelho (aka falkTX) <falktx@falktx.com>
10   or ask in #lad channel, FreeNode IRC network.
11 */
12 
13 /**
14  * @file lv2_rtmempool.h
15  * C header for the LV2 rtmempool extension <http://kxstudio.sf.net/ns/lv2ext/rtmempool>.
16  *
17  */
18 
19 #ifndef LV2_RTMEMPOOL_H
20 #define LV2_RTMEMPOOL_H
21 
22 #define LV2_RTSAFE_MEMORY_POOL_URI    "http://kxstudio.sf.net/ns/lv2ext/rtmempool"
23 #define LV2_RTSAFE_MEMORY_POOL_PREFIX LV2_RTSAFE_MEMORY_POOL_URI "#"
24 
25 #define LV2_RTSAFE_MEMORY_POOL__Pool  LV2_RTSAFE_MEMORY_POOL_URI "Pool"
26 
27 /** max size of memory pool name, in chars, including terminating zero char */
28 #define LV2_RTSAFE_MEMORY_POOL_NAME_MAX 128
29 
30 /** This extension used to be defined by a different URI */
31 #define LV2_RTSAFE_MEMORY_POOL_DEPRECATED_URI "http://home.gna.org/lv2dynparam/rtmempool/v1"
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #else
36 #include <stdbool.h>
37 #endif
38 
39 /**
40  * Opaque data to host data for LV2_RtMemPool_Pool.
41  */
42 typedef void* LV2_RtMemPool_Handle;
43 
44 /**
45  * On instantiation, host must supply LV2_RTSAFE_MEMORY_POOL__Pool feature.
46  * LV2_Feature::data must be pointer to LV2_RtMemPool_Pool.
47  */
48 typedef struct _LV2_RtMemPool_Pool {
49   /**
50    * This function is called when plugin wants to create memory pool
51    *
52    * <b>may/will sleep</b>
53    *
54    * @param pool_name pool name, for debug purposes, max RTSAFE_MEMORY_POOL_NAME_MAX chars, including terminating zero char. May be NULL.
55    * @param data_size memory chunk size
56    * @param min_preallocated min chunks preallocated
57    * @param max_preallocated max chunks preallocated
58    *
59    * @return Success status, true if successful
60    */
61   bool (*create)(LV2_RtMemPool_Handle * handle_ptr,
62                  const char * pool_name,
63                  size_t data_size,
64                  size_t min_preallocated,
65                  size_t max_preallocated);
66 
67   /**
68    * This function is called when plugin wants to destroy previously created memory pool
69    *
70    * <b>may/will sleep</b>
71    */
72   void (*destroy)(LV2_RtMemPool_Handle handle);
73 
74   /**
75    * This function is called when plugin wants to allocate memory in context where sleeping is not allowed
76    *
77    * <b>will not sleep</b>
78    *
79    * @return Pointer to allocated memory or NULL if memory no memory is available
80    */
81   void * (*allocate_atomic)(LV2_RtMemPool_Handle handle);
82 
83   /**
84    * This function is called when plugin wants to allocate memory in context where sleeping is allowed
85    *
86    * <b>may/will sleep</b>
87    *
88    * @return Pointer to allocated memory or NULL if memory no memory is available (should not happen under normal conditions)
89    */
90   void * (*allocate_sleepy)(LV2_RtMemPool_Handle handle);
91 
92   /**
93    * This function is called when plugin wants to deallocate previously allocated memory
94    *
95    * <b>will not sleep</b>
96    *
97    * @param memory_ptr pointer to previously allocated memory chunk
98    */
99   void (*deallocate)(LV2_RtMemPool_Handle handle,
100                      void * memory_ptr);
101 
102 } LV2_RtMemPool_Pool;
103 
104 /**
105  * Deprecated feature for backwards compatibility.
106  */
107 typedef struct _LV2_RtMemPool_Pool_Deprecated {
108   unsigned char (*create)(const char*,size_t,size_t,size_t,LV2_RtMemPool_Handle*);
109   void  (*destroy)(LV2_RtMemPool_Handle);
110   void* (*allocate_atomic)(LV2_RtMemPool_Handle);
111   void* (*allocate_sleepy)(LV2_RtMemPool_Handle);
112   void  (*deallocate)(LV2_RtMemPool_Handle,void*);
113 } LV2_RtMemPool_Pool_Deprecated;
114 
115 #ifdef __cplusplus
116 } /* extern "C" */
117 #endif
118 
119 #endif /* LV2_RTMEMPOOL_H */
120