mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-06 22:08:41 +00:00
clean up search data commit on scope-hold mechanism
This commit is contained in:
+13
-6
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user