-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathpriority-queue.lisp
More file actions
70 lines (59 loc) · 2.39 KB
/
priority-queue.lisp
File metadata and controls
70 lines (59 loc) · 2.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
;; priority-queue.lisp -- Priority Queue based on Binary Trees
;; DM/RAL 02/09
;; --------------------------------------------------------------
(in-package :com.ral.priority-queue)
;; -------------------------------------------------------------------------------------------
(defclass priority-queue ()
((lock :accessor priority-queue-lock :initform (mpcompat:make-lock))
(condv :accessor priority-queue-condition-variable :initform (mpcompat:make-condition-variable))
(count :accessor priority-queue-count :initform 0)
(top :accessor priority-queue-top :initform nil) ;; a tree root
))
(defun add-item (priq key item)
(with-accessors ((lock priority-queue-lock)
(top priority-queue-top)
(count priority-queue-count)
(condv priority-queue-condition-variable)) priq
(mpcompat:with-spinlock (lock)
(setf top (maps:add key item top))
(incf count)
(mpcompat:condition-variable-signal condv)) ))
(defun remove-item (priq)
(with-accessors ((top priority-queue-top)
(count priority-queue-count)
(lock priority-queue-lock)
(condv priority-queue-condition-variable)) priq
(mpcompat:with-spinlock (lock)
(when (maps:is-empty top)
(mpcompat:condition-variable-wait condv lock
:wait-reason "Waiting for priority mail"))
(let ((val (maps::map-cell-val (sets:min-elt top))))
(setf top (sets:remove-min-elt top))
(decf count)
val) )))
;; ------------------------------------------------------------
#|
(progn
(defun child-nodes-for-viewing (node)
(when node
(let* ((l (sets-internal::node-left node))
(r (sets-internal::node-right node))
(v (and l (list l))))
(if r
(cons r v)
v))))
(defun node-value-string (node)
(if node
(format nil "~A" (maps::map-cell-key (sets-internal::node-val node)))
))
(defun view-tree (tree)
(CAPI:CONTAIN
(MAKE-INSTANCE 'CAPI:GRAPH-PANE
:ROOTS (list tree)
:CHILDREN-FUNCTION
'child-nodes-for-viewing
:PRINT-FUNCTION
'node-value-string)))
(defun view-queue (q)
(view-tree (priority-queue-top q))) )
|#