21 #ifndef OMPI_FREE_LIST_H
22 #define OMPI_FREE_LIST_H
24 #include "ompi_config.h"
25 #include "opal/class/opal_atomic_lifo.h"
27 #include "opal/threads/condition.h"
28 #include "ompi/constants.h"
33 struct mca_mem_pool_t;
36 typedef void (*ompi_free_list_item_init_fn_t) (
42 size_t fl_max_to_alloc;
43 size_t fl_num_allocated;
44 size_t fl_num_per_alloc;
45 size_t fl_num_waiting;
47 size_t fl_frag_alignment;
48 size_t fl_payload_buffer_size;
49 size_t fl_payload_buffer_alignment;
55 ompi_free_list_item_init_fn_t item_init;
83 OMPI_DECLSPEC
int ompi_free_list_init_ex(
88 int num_elements_to_alloc,
89 int max_elements_to_alloc,
90 int num_elements_per_alloc,
92 ompi_free_list_item_init_fn_t item_init,
96 static inline int ompi_free_list_init(
100 int num_elements_to_alloc,
101 int max_elements_to_alloc,
102 int num_elements_per_alloc,
105 return ompi_free_list_init_ex(free_list, element_size, opal_cache_line_size,
106 element_class, num_elements_to_alloc, max_elements_to_alloc,
107 num_elements_per_alloc, mpool, NULL, NULL);
127 OMPI_DECLSPEC
int ompi_free_list_init_ex_new(
130 size_t frag_alignment,
132 size_t payload_buffer_size,
133 size_t payload_buffer_alignment,
134 int num_elements_to_alloc,
135 int max_elements_to_alloc,
136 int num_elements_per_alloc,
138 ompi_free_list_item_init_fn_t item_init,
156 static inline int ompi_free_list_init_new(
159 size_t frag_alignment,
161 size_t payload_buffer_size,
162 size_t payload_buffer_alignment,
163 int num_elements_to_alloc,
164 int max_elements_to_alloc,
165 int num_elements_per_alloc,
168 return ompi_free_list_init_ex_new(free_list,
169 frag_size, frag_alignment, frag_class,
170 payload_buffer_size, payload_buffer_alignment,
171 num_elements_to_alloc, max_elements_to_alloc,
172 num_elements_per_alloc, mpool, NULL, NULL);
175 OMPI_DECLSPEC
int ompi_free_list_grow(
ompi_free_list_t* flist,
size_t num_elements);
181 OMPI_DECLSPEC
int ompi_free_list_resize(
ompi_free_list_t *flist,
size_t size);
196 #define OMPI_FREE_LIST_GET(fl, item, rc) \
199 item = (ompi_free_list_item_t*) opal_atomic_lifo_pop(&((fl)->super)); \
200 if( OPAL_UNLIKELY(NULL == item) ) { \
201 if(opal_using_threads()) { \
202 opal_mutex_lock(&((fl)->fl_lock)); \
203 ompi_free_list_grow((fl), (fl)->fl_num_per_alloc); \
204 opal_mutex_unlock(&((fl)->fl_lock)); \
206 ompi_free_list_grow((fl), (fl)->fl_num_per_alloc); \
208 item = (ompi_free_list_item_t*) opal_atomic_lifo_pop(&((fl)->super)); \
209 if( OPAL_UNLIKELY(NULL == item) ) rc = OMPI_ERR_TEMP_OUT_OF_RESOURCE; \
226 #define OMPI_FREE_LIST_WAIT(fl, item, rc) \
227 rc = __ompi_free_list_wait( (fl), &(item) )
233 while( NULL == *item ) {
235 if((fl)->fl_max_to_alloc <= (fl)->fl_num_allocated) {
236 (fl)->fl_num_waiting++;
237 opal_condition_wait(&((fl)->fl_condition), &((fl)->fl_lock));
238 (fl)->fl_num_waiting--;
240 if(ompi_free_list_grow((fl), (fl)->fl_num_per_alloc)
242 if( 0 < (fl)->fl_num_waiting ) {
243 if( 1 == (fl)->fl_num_waiting ) {
244 opal_condition_signal(&((fl)->fl_condition));
246 opal_condition_broadcast(&((fl)->fl_condition));
250 (fl)->fl_num_waiting++;
251 opal_condition_wait(&((fl)->fl_condition), &((fl)->fl_lock));
252 (fl)->fl_num_waiting--;
276 #define OMPI_FREE_LIST_RETURN(fl, item) \
278 opal_list_item_t* original; \
280 original = opal_atomic_lifo_push( &(fl)->super, \
282 if( &(fl)->super.opal_lifo_ghost == original ) { \
283 OPAL_THREAD_LOCK(&(fl)->fl_lock); \
284 if((fl)->fl_num_waiting > 0) { \
285 if( 1 == (fl)->fl_num_waiting ) { \
286 opal_condition_signal(&((fl)->fl_condition)); \
288 opal_condition_broadcast(&((fl)->fl_condition)); \
291 OPAL_THREAD_UNLOCK(&(fl)->fl_lock); \
#define OPAL_THREAD_TRYLOCK(mutex)
Try to lock a mutex if opal_using_threads() says that multiple threads may be active in the process...
Definition: mutex.h:269
Definition: condition.h:49
Definition: mutex_unix.h:53
Definition: opal_atomic_lifo.h:42
Definition: opal_list.h:98
#define OPAL_THREAD_LOCK(mutex)
Lock a mutex if opal_using_threads() says that multiple threads may be active in the process...
Definition: mutex.h:223
Class descriptor.
Definition: opal_object.h:152
#define OPAL_THREAD_UNLOCK(mutex)
Unlock a mutex if opal_using_threads() says that multiple threads may be active in the process...
Definition: mutex.h:309
Definition: ompi_free_list.h:39
Definition: ompi_free_list.h:62
Definition: opal_list.h:147
Compiler-specific prefetch functions.
#define OBJ_CLASS_DECLARATION(NAME)
Declaration for class descriptor.
Definition: opal_object.h:236
mpool module descriptor.
Definition: mpool.h:174