git.fiddlerwoaroof.com
Browse code

Add lifecycle methods

Ed Langley authored on 08/02/2019 02:26:09
Showing 2 changed files
... ...
@@ -16,6 +16,10 @@
16 16
   (:method (event-loop)
17 17
     (declare (ignore event-loop))))
18 18
 
19
+(defgeneric cleanup (event-loop)
20
+  (:method (event-loop)
21
+    (declare (ignore event-loop))))
22
+
19 23
 (defgeneric queue (event-loop))
20 24
 
21 25
 (defgeneric register-finish-cb (cb event-loop))
... ...
@@ -24,16 +28,19 @@
24 28
 
25 29
 (defparameter *task-depth* 10)
26 30
 
31
+(defmacro until-finished (finished-var &body body)
32
+  `(loop until ,finished-var do
33
+         ,@body))
34
+
27 35
 (defun run-loop (event-loop)
28 36
   (let ((finished nil))
29 37
     (register-finish-cb (lambda ()
30 38
                           (setf finished t))
31 39
                         event-loop)
32 40
     (prepare-loop event-loop)
33
-    (loop
34
-      until finished
35
-      do
36
-         (tick event-loop))))
41
+    (unwind-protect (until-finished finished
42
+                      (tick event-loop))
43
+      (cleanup event-loop))))
37 44
 
38 45
 (defun wait-for-promise (promise)
39 46
   (let* ((result-queue (make-instance 'chanl:bounded-channel)))
... ...
@@ -6,4 +6,5 @@
6 6
    #:run-loop
7 7
    #:wait-for-promise
8 8
    #:prepare-loop
9
-   #:register-finish-cb))
9
+   #:register-finish-cb
10
+   #:cleanup))