actors: Switch random-number-size to be 2^128.
[8sync.git] / 8sync / systems / actors.scm
index 8f00d570d9f5880d901a6063334e59e047d3f4d0..f6da0bdf0bf77623f1f25606534271c60843e76b 100644 (file)
@@ -59,6 +59,9 @@
             hive-id
             hive-create-actor hive-create-actor*
 
+            create-actor create-actor*
+            self-destruct
+
             <message>
             make-message message?
             message-to message-action message-from
@@ -80,8 +83,8 @@
 (define %random-state
   (make-parameter (random-state-from-platform)))
 
-;; Probably bigger than necessary
-(define random-number-size (expt 10 50))
+;; Same size as a uuid4 I think...
+(define random-number-size (expt 2 128))
 
 (define (big-random-number)
   (random random-number-size (%random-state)))
@@ -198,7 +201,7 @@ If key not found and DFLT not provided, throw an error."
          (message (make-message (hive-gen-message-id hive) to-id
                                 (actor-id from-actor) action
                                 (kwarg-list-to-alist message-body-args))))
-    (8sync (hive-process-message hive message))))
+    (8sync-nowait (hive-process-message hive message))))
 
 (define (send-message-wait from-actor to-id action . message-body-args)
   "Send a message from an actor to another, but wait until we get a response"
@@ -225,7 +228,7 @@ If key not found and DFLT not provided, throw an error."
                                     (actor-id from-actor) '*reply*
                                     (kwarg-list-to-alist message-body-args)
                                     #:in-reply-to (message-id original-message))))
-    (8sync (hive-process-message hive new-message))))
+    (8sync-nowait (hive-process-message hive new-message))))
 
 (define (reply-message-wait from-actor original-message
                             . message-body-args)
@@ -590,6 +593,37 @@ Instead, actors should call create-actor."
   (hive #:init-keyword #:hive))
 
 
+\f
+;;; Various API methods for actors to interact with the system
+;;; ==========================================================
+
+;; TODO: move send-message and friends here...?
+
+;; TODO: Rewrite this inside of a <hive-proxy> ?
+(define* (create-actor from-actor actor-class #:rest init)
+  "Create an instance of actor-class.  Return the new actor's id.
+
+This is the method actors should call directly (unless they want
+to supply an id-cookie, in which case they should use
+create-actor*)."
+  (8sync (%hive-create-actor (actor-hive from-actor) actor-class
+                             init #f)))
+
+
+(define* (create-actor* from-actor actor-class id-cookie #:rest init)
+  "Create an instance of actor-class.  Return the new actor's id.
+
+Like create-actor, but permits supplying an id-cookie."
+  (8sync (%hive-create-actor (actor-hive from-actor) actor-class
+                             init id-cookie)))
+
+
+(define (self-destruct actor)
+  "Remove an actor from the hive."
+  (hash-remove! (hive-actor-registry (actor-hive actor))
+                (actor-id actor)))
+
+
 \f
 ;;; 8sync bootstrap utilities
 ;;; =========================