projects
/
8sync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
actors: Allow actors to specify whether to handle an *init* action.
[8sync.git]
/
8sync
/
actors.scm
diff --git
a/8sync/actors.scm
b/8sync/actors.scm
index 04e1c06a4e2b563a7d6dfb2c63b76959cf7ee12f..1b120ba77916e1e3f9bd08029cfa4398218a5e66 100644
(file)
--- a/
8sync/actors.scm
+++ b/
8sync/actors.scm
@@
-339,6
+339,13
@@
to come after class definition."
#:allocation #:each-subclass
#:getter actor-message-handler)
#:allocation #:each-subclass
#:getter actor-message-handler)
+ ;; valid values are:
+ ;; - #t as in, send the init message, but don't wait (default)
+ ;; - 'wait, as in wait on the init message
+ ;; - #f as in don't bother to init
+ (should-init #:init-value #t
+ #:allocation #:each-subclass)
+
;; This is the default, "simple" way to inherit and process messages.
(actions #:init-value (build-actions
;; Default init method is to do nothing.
;; This is the default, "simple" way to inherit and process messages.
(actions #:init-value (build-actions
;; Default init method is to do nothing.
@@
-444,10
+451,14
@@
to come after class definition."
(hash-map->list (lambda (actor-id actor) actor-id)
(hive-actor-registry hive)))
(for-each (lambda (actor-id)
(hash-map->list (lambda (actor-id actor) actor-id)
(hive-actor-registry hive)))
(for-each (lambda (actor-id)
- ;; @@: This could maybe just be <-, but we want actors
- ;; to be used to the expectation in all circumstances
- ;; that their init method is "waited on".
- (<-wait actor-id '*init*))
+ (let* ((actor (hash-ref (hive-actor-registry hive)
+ actor-id)))
+ (match (slot-ref actor 'should-init)
+ (#f #f)
+ ('wait
+ (<-wait actor-id '*init*))
+ (_
+ (<- actor-id '*init*)))))
actor-ids))
(define-method (hive-handle-failed-forward (hive <hive>) message)
actor-ids))
(define-method (hive-handle-failed-forward (hive <hive>) message)
@@
-684,11
+695,15
@@
that method for documentation."
(actor (apply make actor-class
#:hive hive
#:id actor-id
(actor (apply make actor-class
#:hive hive
#:id actor-id
- init-args)))
+ init-args))
+ (actor-should-init (slot-ref actor 'should-init)))
(hive-register-actor! hive actor)
(hive-register-actor! hive actor)
- ;; Wait on actor to init
- (when send-init?
- (<-wait actor-id '*init*))
+ ;; Maybe run actor init method
+ (when (and send-init? actor-should-init)
+ (let ((send-method
+ (if (eq? actor-should-init 'wait)
+ <-wait <-)))
+ (send-method actor-id '*init*)))
;; return the actor id
actor-id))
;; return the actor id
actor-id))