22
22
#define MAP_IMPL_STYLE 2
23
23
#include "../util/tmpl/fd_map_para.c"
24
24
25
+ #include "../flamenco/fd_rwlock.h"
26
+ static fd_rwlock_t _pool_lock = {0 };
27
+
25
28
fd_funkier_rec_t const *
26
29
fd_funkier_rec_query_try ( fd_funkier_t * funk ,
27
30
fd_funkier_txn_t const * txn ,
@@ -203,7 +206,9 @@ fd_funkier_rec_prepare( fd_funkier_t * funk,
203
206
prepare -> funk = funk ;
204
207
prepare -> wksp = fd_funkier_wksp ( funk );
205
208
fd_funkier_rec_pool_t rec_pool = fd_funkier_rec_pool ( funk , prepare -> wksp );
209
+ fd_rwlock_write (& _pool_lock );
206
210
fd_funkier_rec_t * rec = prepare -> rec = fd_funkier_rec_pool_acquire ( & rec_pool , NULL , 1 , opt_err );
211
+ fd_rwlock_unwrite (& _pool_lock );
207
212
if ( opt_err && * opt_err == FD_POOL_ERR_CORRUPT ) {
208
213
FD_LOG_ERR (( "corrupt element returned from funkier rec pool" ));
209
214
}
@@ -254,6 +259,7 @@ fd_funkier_rec_publish( fd_funkier_rec_prepare_t * prepare ) {
254
259
/* We need to hold the pool lock whilst inserting and removing from the map, to make the updates
255
260
to the prev_idx/next_idx pointers atomic. */
256
261
fd_funkier_rec_pool_lock ( & rec_pool , 1 );
262
+ fd_rwlock_write (& _pool_lock );
257
263
rec -> prev_idx = rec_prev_idx ;
258
264
if ( fd_funkier_rec_idx_is_null ( rec_prev_idx ) ) {
259
265
* rec_head_idx = rec_idx ;
@@ -264,14 +270,17 @@ fd_funkier_rec_publish( fd_funkier_rec_prepare_t * prepare ) {
264
270
if ( fd_funkier_rec_map_insert ( & rec_map , rec , FD_MAP_FLAG_BLOCKING ) ) {
265
271
FD_LOG_CRIT (( "fd_funkier_rec_map_insert failed" ));
266
272
}
273
+ fd_rwlock_unwrite (& _pool_lock );
267
274
fd_funkier_rec_pool_unlock ( & rec_pool );
268
275
}
269
276
270
277
void
271
278
fd_funkier_rec_cancel ( fd_funkier_rec_prepare_t * prepare ) {
272
279
fd_funkier_val_flush ( prepare -> rec , fd_funkier_alloc ( prepare -> funk , prepare -> wksp ), prepare -> wksp );
273
280
fd_funkier_rec_pool_t rec_pool = fd_funkier_rec_pool ( prepare -> funk , prepare -> wksp );
281
+ fd_rwlock_write (& _pool_lock );
274
282
fd_funkier_rec_pool_release ( & rec_pool , prepare -> rec , 1 );
283
+ fd_rwlock_unwrite (& _pool_lock );
275
284
}
276
285
277
286
fd_funkier_rec_t *
@@ -335,13 +344,15 @@ fd_funkier_rec_hard_remove( fd_funkier_t * funk,
335
344
fd_funkier_rec_key_copy ( pair -> key , key );
336
345
337
346
fd_funkier_rec_pool_lock ( & rec_pool , 1 );
347
+ fd_rwlock_write (& _pool_lock );
338
348
339
349
fd_funkier_rec_t * rec = NULL ;
340
350
for (;;) {
341
351
fd_funkier_rec_map_query_t rec_query [1 ];
342
352
int err = fd_funkier_rec_map_remove ( & rec_map , pair , NULL , rec_query , FD_MAP_FLAG_BLOCKING );
343
353
if ( FD_UNLIKELY ( err == FD_MAP_ERR_AGAIN ) ) continue ;
344
354
if ( err == FD_MAP_ERR_KEY ) {
355
+ fd_rwlock_unwrite (& _pool_lock );
345
356
fd_funkier_rec_pool_unlock ( & rec_pool );
346
357
return ;
347
358
}
@@ -363,10 +374,13 @@ fd_funkier_rec_hard_remove( fd_funkier_t * funk,
363
374
if ( fd_funkier_rec_idx_is_null ( next_idx ) ) txn -> rec_tail_idx = prev_idx ;
364
375
else rec_pool .ele [ next_idx ].prev_idx = prev_idx ;
365
376
}
377
+ fd_rwlock_unwrite (& _pool_lock );
366
378
fd_funkier_rec_pool_unlock ( & rec_pool );
367
379
368
380
fd_funkier_val_flush ( rec , alloc , wksp );
381
+ fd_rwlock_write (& _pool_lock );
369
382
fd_funkier_rec_pool_release ( & rec_pool , rec , 1 );
383
+ fd_rwlock_unwrite (& _pool_lock );
370
384
}
371
385
372
386
int
0 commit comments