summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorOmar Rizwan <omar@omar.website>2023-09-06 09:59:55 +0000
committerOmar Rizwan <omar@omar.website>2023-09-06 09:59:55 +0000
commitb4d9326bd339e28a4ffa2252eacc81f6824fd09e (patch)
treeee0e34a5c4bef80fa0ca4df8a72a8a3026759d35 /lib
parentWIP: Start work on pqueue-based evaluator (diff)
downloadfolk-b4d9326bd339e28a4ffa2252eacc81f6824fd09e.tar.gz
folk-b4d9326bd339e28a4ffa2252eacc81f6824fd09e.zip
Finish pqueue usage -- performs ok (300 operations/frame)
Diffstat (limited to 'lib')
-rw-r--r--lib/evaluator.tcl18
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);
}
}