X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=sam.git;a=blobdiff_plain;f=sam.scm;h=5c5ec886a760d2e65394379e202b8e32d9512892;hp=431cd1c41ce9b9cac0e68843cc39ab80ab6aa3c8;hb=bf8a20a40dd9e5d963498a0fe43ef5fea52d07c6;hpb=2ddb195dc4dace1129e50e10c6992e2ae95fae83 diff --git a/sam.scm b/sam.scm index 431cd1c..5c5ec88 100644 --- a/sam.scm +++ b/sam.scm @@ -8,8 +8,8 @@ matchable srfi-18 ; threads srfi-69 ; hashtable - udp6 - uri-generic) + udp + fifo) ;; Actors @@ -38,18 +38,19 @@ (define (deliver-message address . message) (let ((id (address-id address))) - (let ((behaviour (hash-table-ref/default actor-table id '())))) - (if (null? behaviour) - (print "Warning: discarded message" message " to unknown actor " address) - (match (apply (hash-table-ref actor-table id) (cons address message)) - ('done (hash-table-delete! actor-table actor)) - ('sleep 'do-nothing) - (new-beh (hash-table-put! actor new-beh)))))) + (let ((behaviour (hash-table-ref/default actor-table id '()))) + (if (null? behaviour) + (print "Warning: discarded message" message " to unknown actor " address) + (match (apply (hash-table-ref actor-table id) (cons address message)) + ('done (hash-table-delete! actor-table actor)) + ('sleep 'do-nothing) + (new-beh (hash-table-put! actor new-beh))))))) ;; Scheduler (define local-queue-mutex (make-mutex "message queue")) (define message-available-mutex (make-mutex "message available")) +(mutex-lock! message-available-mutex #f #f) (define local-queue (make-fifo)) (define (send-message address . message) @@ -61,6 +62,7 @@ (define (send-local-message address . message) (mutex-lock! local-queue-mutex) (fifo-push local-queue (cons address message)) + (mutex-unlock! message-available-mutex) (mutex-unlock! local-queue-mutex)) (define (send-network-message address . message) @@ -75,10 +77,10 @@ (define (next-local-message) (let ((res #f)) + (mutex-lock! message-available-mutex) (mutex-lock! local-queue-mutex) - (set! res (if (fifo-empty? local-queue) - #f - (fifo-pop local-queue))) + (set! res (fifo-pop local-queue)) + (mutex-unlock! message-available-mutex) (mutex-unlock! local-queue-mutex) res)) @@ -86,9 +88,9 @@ (make-thread (lambda () (let loop ((next-addressed-message (next-local-message))) - (if next-addressed-message - (apply deliver-message next-addressed-message) - (begin - (lo)))))) + (apply deliver-message next-addressed-message) + (loop (next-local-message)))))) - (thread-start!)) +(thread-start! scheduler-thread) + +(thread-join! scheduler-thread)