clean up search data commit on scope-hold mechanism

This commit is contained in:
Ryan Fleury
2025-05-17 13:33:43 -07:00
parent 5cb2a7bbde
commit f99dd2a477
2 changed files with 15 additions and 7 deletions
+13 -6
View File
@@ -283,6 +283,7 @@ di_scope_close(DI_Scope *scope)
if(t->search_node != 0) if(t->search_node != 0)
{ {
ins_atomic_u64_dec_eval(&t->search_node->scope_refcount); ins_atomic_u64_dec_eval(&t->search_node->scope_refcount);
os_condition_variable_broadcast(t->search_stripe->cv);
} }
SLLStackPush(di_tctx->free_touch, t); SLLStackPush(di_tctx->free_touch, t);
} }
@@ -311,7 +312,7 @@ di_scope_touch_node__stripe_mutex_r_guarded(DI_Scope *scope, DI_Node *node)
} }
internal void internal void
di_scope_touch_search_node__stripe_mutex_r_guarded(DI_Scope *scope, DI_SearchNode *node) di_scope_touch_search_node__stripe_mutex_r_guarded(DI_Scope *scope, DI_SearchStripe *stripe, DI_SearchNode *node)
{ {
if(node != 0) if(node != 0)
{ {
@@ -329,6 +330,7 @@ di_scope_touch_search_node__stripe_mutex_r_guarded(DI_Scope *scope, DI_SearchNod
MemoryZeroStruct(touch); MemoryZeroStruct(touch);
SLLQueuePush(scope->first_touch, scope->last_touch, touch); SLLQueuePush(scope->first_touch, scope->last_touch, touch);
touch->search_node = node; touch->search_node = node;
touch->search_stripe = stripe;
} }
//////////////////////////////// ////////////////////////////////
@@ -709,7 +711,7 @@ di_search_items_from_key_params_query(DI_Scope *scope, U128 key, DI_SearchParams
B32 results_stale = 1; B32 results_stale = 1;
if(node->bucket_read_gen != 0) if(node->bucket_read_gen != 0)
{ {
di_scope_touch_search_node__stripe_mutex_r_guarded(scope, node); di_scope_touch_search_node__stripe_mutex_r_guarded(scope, stripe, node);
items = node->items; items = node->items;
params_stale = (params_hash != node->buckets[node->bucket_read_gen%ArrayCount(node->buckets)].params_hash); params_stale = (params_hash != node->buckets[node->bucket_read_gen%ArrayCount(node->buckets)].params_hash);
query_stale = !str8_match(query, node->buckets[node->bucket_read_gen%ArrayCount(node->buckets)].query, 0); query_stale = !str8_match(query, node->buckets[node->bucket_read_gen%ArrayCount(node->buckets)].query, 0);
@@ -1473,13 +1475,14 @@ di_search_thread__entry_point(void *p)
quick_sort(items.v, items.count, sizeof(DI_SearchItem), di_qsort_compare_search_items); quick_sort(items.v, items.count, sizeof(DI_SearchItem), di_qsort_compare_search_items);
} }
//- rjf: commit to cache - busyloop on scope touches //- rjf: commit to cache - wait on scope touches
if(arena != 0) if(arena != 0)
{ {
for(B32 done = 0; !done;) OS_MutexScopeW(stripe->rw_mutex) for(;;)
{ {
B32 found = 0; B32 found = 0;
OS_MutexScopeW(stripe->rw_mutex) for(DI_SearchNode *n = slot->first; n != 0; n = n->next) B32 done = 0;
for(DI_SearchNode *n = slot->first; n != 0; n = n->next)
{ {
if(u128_match(n->key, key)) if(u128_match(n->key, key))
{ {
@@ -1498,10 +1501,14 @@ di_search_thread__entry_point(void *p)
break; break;
} }
} }
if(!found) if((found && done) || !found)
{ {
break; break;
} }
if(found && !done)
{
os_condition_variable_wait_rw_w(stripe->cv, stripe->rw_mutex, os_now_microseconds()+1000);
}
} }
} }
+2 -1
View File
@@ -219,6 +219,7 @@ struct DI_Touch
DI_Touch *next; DI_Touch *next;
DI_Node *node; DI_Node *node;
DI_SearchNode *search_node; DI_SearchNode *search_node;
DI_SearchStripe *search_stripe;
}; };
typedef struct DI_Scope DI_Scope; typedef struct DI_Scope DI_Scope;
@@ -410,7 +411,7 @@ internal void di_init(void);
internal DI_Scope *di_scope_open(void); internal DI_Scope *di_scope_open(void);
internal void di_scope_close(DI_Scope *scope); internal void di_scope_close(DI_Scope *scope);
internal void di_scope_touch_node__stripe_mutex_r_guarded(DI_Scope *scope, DI_Node *node); internal void di_scope_touch_node__stripe_mutex_r_guarded(DI_Scope *scope, DI_Node *node);
internal void di_scope_touch_search_node__stripe_mutex_r_guarded(DI_Scope *scope, DI_SearchNode *node); internal void di_scope_touch_search_node__stripe_mutex_r_guarded(DI_Scope *scope, DI_SearchStripe *stripe, DI_SearchNode *node);
//////////////////////////////// ////////////////////////////////
//~ rjf: Per-Slot Functions //~ rjf: Per-Slot Functions