6 #ifndef ABTI_MEM_POOL_H_INCLUDED
7 #define ABTI_MEM_POOL_H_INCLUDED
9 #define ABT_MEM_POOL_MAX_LOCAL_BUCKETS 2
10 #define ABT_MEM_POOL_NUM_RETURN_BUCKETS 1
11 #define ABT_MEM_POOL_NUM_TAKE_BUCKETS 1
13 typedef union ABTI_mem_pool_header_bucket_info {
15 ABTI_sync_lifo_element lifo_elem;
18 } ABTI_mem_pool_header_bucket_info;
20 typedef struct ABTI_mem_pool_header {
21 struct ABTI_mem_pool_header *p_next;
22 ABTI_mem_pool_header_bucket_info bucket_info;
23 } ABTI_mem_pool_header;
25 typedef struct ABTI_mem_pool_page {
26 ABTI_sync_lifo_element lifo_elem;
27 struct ABTI_mem_pool_page *p_next_empty_page;
32 size_t mem_extra_size;
49 typedef struct ABTI_mem_pool_global_pool {
52 size_t alignment_hint;
56 int num_headers_per_bucket;
57 int num_lp_type_requests;
62 ABTI_sync_lifo bucket_lifo;
64 ABTI_sync_lifo mem_page_lifo;
66 ABTD_atomic_ptr p_mem_page_empty;
71 ABTI_spinlock partial_bucket_lock;
72 ABTI_mem_pool_header *partial_bucket;
73 } ABTI_mem_pool_global_pool;
89 typedef struct ABTI_mem_pool_local_pool {
90 ABTI_mem_pool_global_pool *p_global_pool;
91 size_t num_headers_per_bucket;
96 } ABTI_mem_pool_local_pool;
98 void ABTI_mem_pool_init_global_pool(
99 ABTI_mem_pool_global_pool *p_global_pool,
int num_headers_per_bucket,
100 size_t header_size,
size_t header_offset,
size_t page_size,
102 size_t alignment_hint);
103 void ABTI_mem_pool_destroy_global_pool(
104 ABTI_mem_pool_global_pool *p_global_pool);
105 void ABTI_mem_pool_init_local_pool(ABTI_mem_pool_local_pool *p_local_pool,
106 ABTI_mem_pool_global_pool *p_global_pool);
107 void ABTI_mem_pool_destroy_local_pool(ABTI_mem_pool_local_pool *p_local_pool);
108 int ABTI_mem_pool_take_bucket(ABTI_mem_pool_global_pool *p_global_pool,
109 ABTI_mem_pool_header **p_bucket);
110 void ABTI_mem_pool_return_bucket(ABTI_mem_pool_global_pool *p_global_pool,
111 ABTI_mem_pool_header *bucket);
114 ABTI_mem_pool_alloc(ABTI_mem_pool_local_pool *p_local_pool,
void **p_mem)
116 size_t bucket_index = p_local_pool->bucket_index;
117 ABTI_mem_pool_header *cur_bucket = p_local_pool->buckets[bucket_index];
118 int num_headers_in_cur_bucket = cur_bucket->bucket_info.num_headers;
121 ABTI_ASSERT(num_headers_in_cur_bucket >= 1);
122 if (num_headers_in_cur_bucket == 1) {
124 if (bucket_index == 0) {
130 ABTI_mem_pool_take_bucket(p_local_pool->p_global_pool,
131 &p_local_pool->buckets[i]);
132 if (ABTI_IS_ERROR_CHECK_ENABLED && abt_errno !=
ABT_SUCCESS) {
135 for (j = 0; j < i; j++) {
136 ABTI_mem_pool_return_bucket(p_local_pool->p_global_pool,
137 p_local_pool->buckets[j]);
142 p_local_pool->bucket_index = ABT_MEM_POOL_NUM_TAKE_BUCKETS - 1;
144 p_local_pool->bucket_index = bucket_index - 1;
149 ABTI_mem_pool_header *p_next = cur_bucket->p_next;
150 p_next->bucket_info.num_headers = num_headers_in_cur_bucket - 1;
151 p_local_pool->buckets[bucket_index] = p_next;
154 *p_mem = (
void *)cur_bucket;
158 static inline void ABTI_mem_pool_free(ABTI_mem_pool_local_pool *p_local_pool,
162 size_t bucket_index = p_local_pool->bucket_index;
163 ABTI_mem_pool_header *p_freed_header = (ABTI_mem_pool_header *)mem;
164 ABTI_mem_pool_header *cur_bucket = p_local_pool->buckets[bucket_index];
165 if (cur_bucket->bucket_info.num_headers ==
166 p_local_pool->num_headers_per_bucket) {
172 ABTI_mem_pool_return_bucket(p_local_pool->p_global_pool,
173 p_local_pool->buckets[i]);
175 for (i = ABT_MEM_POOL_NUM_RETURN_BUCKETS;
178 p_local_pool->buckets[i];
180 bucket_index = ABT_MEM_POOL_MAX_LOCAL_BUCKETS -
183 p_local_pool->bucket_index = bucket_index;
184 p_freed_header->p_next = NULL;
185 p_freed_header->bucket_info.num_headers = 1;
187 p_freed_header->p_next = cur_bucket;
188 p_freed_header->bucket_info.num_headers =
189 cur_bucket->bucket_info.num_headers + 1;
191 p_local_pool->buckets[bucket_index] = p_freed_header;
#define ABT_MEM_POOL_MAX_LOCAL_BUCKETS
#define ABT_CONFIG_STATIC_CACHELINE_SIZE
#define ABT_MEM_POOL_NUM_TAKE_BUCKETS
#define ABT_MEM_POOL_NUM_RETURN_BUCKETS
#define ABTU_align_member_var(size)