diff options
| author | Omar Rizwan <omar@omar.website> | 2023-09-06 09:59:55 +0000 |
|---|---|---|
| committer | Omar Rizwan <omar@omar.website> | 2023-09-06 09:59:55 +0000 |
| commit | b4d9326bd339e28a4ffa2252eacc81f6824fd09e (patch) | |
| tree | ee0e34a5c4bef80fa0ca4df8a72a8a3026759d35 /lib | |
| parent | WIP: Start work on pqueue-based evaluator (diff) | |
| download | folk-b4d9326bd339e28a4ffa2252eacc81f6824fd09e.tar.gz folk-b4d9326bd339e28a4ffa2252eacc81f6824fd09e.zip | |
Finish pqueue usage -- performs ok (300 operations/frame)
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/evaluator.tcl | 18 |
1 files changed, 12 insertions, 6 deletions
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); } } |
