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)
{
ins_atomic_u64_dec_eval(&t->search_node->scope_refcount);
os_condition_variable_broadcast(t->search_stripe->cv);
}
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
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)
{
@@ -329,6 +330,7 @@ di_scope_touch_search_node__stripe_mutex_r_guarded(DI_Scope *scope, DI_SearchNod
MemoryZeroStruct(touch);
SLLQueuePush(scope->first_touch, scope->last_touch, touch);
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;
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;
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);
@@ -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);
}
//- rjf: commit to cache - busyloop on scope touches
//- rjf: commit to cache - wait on scope touches
if(arena != 0)
{
for(B32 done = 0; !done;)
OS_MutexScopeW(stripe->rw_mutex) for(;;)
{
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))
{
@@ -1498,10 +1501,14 @@ di_search_thread__entry_point(void *p)
break;
}
}
if(!found)
if((found && done) || !found)
{
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_Node *node;
DI_SearchNode *search_node;
DI_SearchStripe *search_stripe;
};
typedef struct DI_Scope DI_Scope;
@@ -410,7 +411,7 @@ internal void di_init(void);
internal DI_Scope *di_scope_open(void);
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_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