From b4d9326bd339e28a4ffa2252eacc81f6824fd09e Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Wed, 6 Sep 2023 05:59:55 -0400 Subject: Finish pqueue usage -- performs ok (300 operations/frame) --- lib/evaluator.tcl | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/evaluator.tcl b/lib/evaluator.tcl index ceae108f..329e14c5 100644 --- a/lib/evaluator.tcl +++ b/lib/evaluator.tcl @@ -1149,6 +1149,8 @@ namespace eval Evaluator { } queue_op_t; typedef struct queue_entry_t { queue_op_t op; + int seq; + union { struct { Tcl_Obj* clause; } assert; struct { Tcl_Obj* pattern; } retract; @@ -1162,21 +1164,22 @@ namespace eval Evaluator { } queue_entry_t; pqueue_t* queue; + int seq; int queueEntryCompare(pqueue_pri_t next, pqueue_pri_t curr) { return next < curr; } pqueue_pri_t queueEntryGetPriority(void* a) { - switch (((queue_entry_t *)a)->op) { + queue_entry_t* entry = a; + switch (entry->op) { case NONE: return 0; case ASSERT: - case RETRACT: return 999; - - case SAY: return 999; + case RETRACT: return 80000 - entry->seq; + case SAY: return 80000 + entry->seq; - case UNMATCH: return 1; - case RECOLLECT: return 0; + case UNMATCH: return 5000 - entry->seq; + case RECOLLECT: return 1000 - entry->seq; } return 0; } @@ -1195,6 +1198,8 @@ namespace eval Evaluator { $cc proc Evaluate {Tcl_Interp* interp} void { op("Evaluate"); + seq = 0; + queue_entry_t* entryPtr; while ((entryPtr = pqueue_pop(queue)) != NULL) { queue_entry_t entry = *entryPtr; ckfree(entryPtr); @@ -1254,6 +1259,7 @@ namespace eval Evaluator { void queueInsert(queue_entry_t entry) { queue_entry_t* ptr = ckalloc(sizeof(entry)); *ptr = entry; + ptr->seq = seq++; pqueue_insert(queue, ptr); } } -- cgit v1.2.3