@@ -435,9 +435,12 @@ fd_banks_init_bank( fd_banks_t * banks, ulong slot ) {
435
435
fd_bank_t * bank_pool = fd_banks_get_bank_pool ( banks );
436
436
fd_banks_map_t * bank_map = fd_banks_get_bank_map ( banks );
437
437
438
+ fd_rwlock_write ( & banks -> rwlock );
439
+
438
440
fd_bank_t * bank = fd_banks_pool_ele_acquire ( bank_pool );
439
441
if ( FD_UNLIKELY ( bank == NULL ) ) {
440
442
FD_LOG_WARNING (( "Failed to acquire bank" ));
443
+ fd_rwlock_unwrite ( & banks -> rwlock );
441
444
return NULL ;
442
445
}
443
446
@@ -484,6 +487,7 @@ fd_banks_init_bank( fd_banks_t * banks, ulong slot ) {
484
487
banks -> root = slot ;
485
488
banks -> root_idx = fd_banks_pool_idx ( bank_pool , bank );
486
489
490
+ fd_rwlock_unwrite ( & banks -> rwlock );
487
491
return bank ;
488
492
}
489
493
@@ -492,18 +496,21 @@ fd_banks_get_bank( fd_banks_t * banks, ulong slot ) {
492
496
fd_bank_t * bank_pool = fd_banks_get_bank_pool ( banks );
493
497
fd_banks_map_t * bank_map = fd_banks_get_bank_map ( banks );
494
498
499
+ fd_rwlock_read ( & banks -> rwlock );
495
500
ulong idx = fd_banks_map_idx_query_const ( bank_map , & slot , ULONG_MAX , bank_pool );
496
501
if ( FD_UNLIKELY ( idx == ULONG_MAX ) ) {
497
502
FD_LOG_DEBUG (( "Failed to get bank idx for slot %lu" , slot ));
503
+ fd_rwlock_unread ( & banks -> rwlock );
498
504
return NULL ;
499
505
}
500
506
501
507
fd_bank_t * bank = fd_banks_pool_ele ( bank_pool , idx );
502
508
if ( FD_UNLIKELY ( !bank ) ) {
503
509
FD_LOG_WARNING (( "Failed to get bank for slot %lu" , slot ));
510
+ fd_rwlock_unread ( & banks -> rwlock );
504
511
return NULL ;
505
512
}
506
-
513
+ fd_rwlock_unread ( & banks -> rwlock );
507
514
return bank ;
508
515
}
509
516
@@ -866,6 +873,7 @@ fd_banks_publish( fd_banks_t * banks, ulong slot ) {
866
873
void
867
874
fd_banks_clear_bank ( fd_banks_t * banks , fd_bank_t * bank ) {
868
875
876
+ fd_rwlock_read ( & banks -> rwlock );
869
877
/* Get the parent bank. */
870
878
fd_bank_t * parent_bank = fd_banks_pool_ele ( fd_banks_get_bank_pool ( banks ), bank -> parent_idx );
871
879
@@ -877,7 +885,7 @@ fd_banks_clear_bank( fd_banks_t * banks, fd_bank_t * bank ) {
877
885
/* assign the bank to the idx corresponding to the parent. */ \
878
886
fd_bank_ ##name ##_pool_idx_release( name##_pool, bank->name##_pool_idx ); \
879
887
bank->name##_dirty = 0; \
880
- bank->name##_pool_idx = !! parent_bank ? parent_bank->name##_pool_idx : fd_bank_##name##_pool_idx_null( name##_pool ); \
888
+ bank->name##_pool_idx = parent_bank ? parent_bank->name##_pool_idx : fd_bank_##name##_pool_idx_null( name##_pool ); \
881
889
}
882
890
883
891
#define HAS_COW_0 (type , name , footprint ) \
@@ -889,24 +897,31 @@ fd_banks_clear_bank( fd_banks_t * banks, fd_bank_t * bank ) {
889
897
#undef X
890
898
#undef HAS_COW_0
891
899
#undef HAS_COW_1
900
+
901
+ fd_rwlock_unread ( & banks -> rwlock );
892
902
}
893
903
894
904
fd_bank_t *
895
905
fd_banks_rekey_root_bank ( fd_banks_t * banks , ulong slot ) {
896
906
907
+ fd_rwlock_write ( & banks -> rwlock );
908
+
897
909
if ( FD_UNLIKELY ( !banks ) ) {
898
910
FD_LOG_WARNING (( "Banks is NULL" ));
911
+ fd_rwlock_unwrite ( & banks -> rwlock );
899
912
return NULL ;
900
913
}
901
914
902
915
if ( FD_UNLIKELY ( banks -> root_idx == fd_banks_pool_idx_null ( fd_banks_get_bank_pool ( banks ) ) ) ) {
903
916
FD_LOG_WARNING (( "Root bank does not exist" ));
917
+ fd_rwlock_unwrite ( & banks -> rwlock );
904
918
return NULL ;
905
919
}
906
920
907
921
fd_bank_t * bank = fd_banks_pool_ele ( fd_banks_get_bank_pool ( banks ), banks -> root_idx );
908
922
if ( FD_UNLIKELY ( !bank ) ) {
909
923
FD_LOG_WARNING (( "Failed to get root bank" ));
924
+ fd_rwlock_unwrite ( & banks -> rwlock );
910
925
return NULL ;
911
926
}
912
927
@@ -915,16 +930,19 @@ fd_banks_rekey_root_bank( fd_banks_t * banks, ulong slot ) {
915
930
bank = fd_banks_map_ele_remove ( fd_banks_get_bank_map ( banks ), & bank -> slot_ , NULL , fd_banks_get_bank_pool ( banks ) );
916
931
if ( FD_UNLIKELY ( !bank ) ) {
917
932
FD_LOG_WARNING (( "Failed to remove root bank" ));
933
+ fd_rwlock_unwrite ( & banks -> rwlock );
918
934
return NULL ;
919
935
}
920
936
921
937
bank -> slot_ = slot ;
922
938
923
939
if ( FD_UNLIKELY ( !fd_banks_map_ele_insert ( fd_banks_get_bank_map ( banks ), bank , fd_banks_get_bank_pool ( banks ) ) ) ) {
924
940
FD_LOG_WARNING (( "Failed to insert root bank" ));
941
+ fd_rwlock_unwrite ( & banks -> rwlock );
925
942
return NULL ;
926
943
}
927
944
945
+ fd_rwlock_unwrite ( & banks -> rwlock );
928
946
return bank ;
929
947
}
930
948
@@ -983,21 +1001,26 @@ fd_banks_publish_prepare( fd_banks_t * banks,
983
1001
fd_bank_t * bank_pool = fd_banks_get_bank_pool ( banks );
984
1002
fd_banks_map_t * bank_map = fd_banks_get_bank_map ( banks );
985
1003
1004
+ fd_rwlock_read ( & banks -> rwlock );
1005
+
986
1006
fd_bank_t * root = fd_banks_root ( banks );
987
1007
if ( FD_UNLIKELY ( !root ) ) {
988
1008
FD_LOG_WARNING (( "failed to get root bank" ));
1009
+ fd_rwlock_unread ( & banks -> rwlock );
989
1010
return 0 ;
990
1011
}
991
1012
992
1013
/* Early exit if target is the same as the old root. */
993
1014
if ( FD_UNLIKELY ( fd_bank_slot_get ( root )== target_slot ) ) {
994
1015
FD_LOG_WARNING (( "target slot %lu is the same as the old root slot %lu" , target_slot , fd_bank_slot_get ( root ) ));
1016
+ fd_rwlock_unread ( & banks -> rwlock );
995
1017
return 0 ;
996
1018
}
997
1019
998
1020
fd_bank_t * target_bank = fd_banks_map_ele_query ( bank_map , & target_slot , NULL , bank_pool );
999
1021
if ( FD_UNLIKELY ( !target_bank ) ) {
1000
1022
FD_LOG_WARNING (( "failed to get bank for target slot %lu" , target_slot ));
1023
+ fd_rwlock_unread ( & banks -> rwlock );
1001
1024
return 0 ;
1002
1025
}
1003
1026
@@ -1101,5 +1124,6 @@ fd_banks_publish_prepare( fd_banks_t * banks,
1101
1124
curr = rooted_child_bank ;
1102
1125
}
1103
1126
1127
+ fd_rwlock_unread ( & banks -> rwlock );
1104
1128
return advanced_publishable_block ;
1105
1129
}
0 commit comments