Threading with fork/semaphore/share
Posted: Tue Sep 18, 2007 2:28 pm
I wrote a couple of functions to automate assigning a (share) and a (semaphore) and blocking when ready to get the data from the child process. It only works on unix/osx, though, since it uses fork and releases the share.
Code: Select all
(define-macro (spawn)
(letn ((expr (args 0))
(sem (semaphore))
(res (share))
(pid (fork (begin
(let ((res-val (eval expr)))
(semaphore sem -1)
(share res (source 'res-val))
(exit))))))
(list pid sem res)))
(define (receive proc sym-result , res-val serialized-result)
(let ((pid (proc 0)) (sem (proc 1)) (res (proc 2)))
(semaphore sem 1)
(wait-pid pid)
(setq serialized-result (share res))
(share nil res)
(semaphore sem 0)
(if (catch (eval-string serialized-result) 'res-val)
res-val 'invalid-result)))