Browse code
Add lifecycle methods
Ed Langley authored on 08/02/2019 02:26:09
Showing 2 changed files
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))) |