diff options
author | Bryan Newbold <bnewbold@robocracy.org> | 2017-02-20 00:05:25 -0800 |
---|---|---|
committer | Bryan Newbold <bnewbold@robocracy.org> | 2017-02-20 00:05:25 -0800 |
commit | 8ffbc2df0fde83082610149d24e594c1cd879f4a (patch) | |
tree | a2be9aad5101c5e450ad141d15c514bc9c2a2963 /process.scm | |
download | slib-8ffbc2df0fde83082610149d24e594c1cd879f4a.tar.gz slib-8ffbc2df0fde83082610149d24e594c1cd879f4a.zip |
Import Upstream version 2a6upstream/2a6
Diffstat (limited to 'process.scm')
-rw-r--r-- | process.scm | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/process.scm b/process.scm new file mode 100644 index 0000000..6b0acc3 --- /dev/null +++ b/process.scm @@ -0,0 +1,68 @@ +;;;; "process.scm", Multi-Processing for Scheme +;;; Copyright (C) 1992, 1993 Aubrey Jaffer. +; +;Permission to copy this software, to redistribute it, and to use it +;for any purpose is granted, subject to the following restrictions and +;understandings. +; +;1. Any copy made of this software must include this copyright notice +;in full. +; +;2. I have made no warrantee or representation that the operation of +;this software will be error-free, and I am under no obligation to +;provide any services, by way of maintenance, update, or otherwise. +; +;3. In conjunction with products arising from the use of this +;material, there shall be no use of my name in any advertising, +;promotional, or sales literature without prior written consent in +;each case. + +(require 'full-continuation) +(require 'queue) + +(define (add-process! thunk1) + (cond ((procedure? thunk1) + (defer-ints) + (enqueue! process:queue thunk1) + (allow-ints)) + (else (slib:error "add-process!: wrong type argument " thunk1)))) + +(define (process:schedule!) + (defer-ints) + (cond ((queue-empty? process:queue) (allow-ints) + 'still-running) + (else (call-with-current-continuation + (lambda (cont) + (enqueue! process:queue cont) + (let ((proc (dequeue! process:queue))) + (allow-ints) + (proc 'run)) + (kill-process!)))))) + +(define (kill-process!) + (defer-ints) + (cond ((queue-empty? process:queue) (allow-ints) + (slib:exit)) + (else (let ((proc (dequeue! process:queue))) + (allow-ints) + (proc 'run)) + (kill-process!)))) + +(define ints-disabled #f) +(define alarm-deferred #f) + +(define (defer-ints) (set! ints-disabled #t)) + +(define (allow-ints) + (set! ints-disabled #f) + (cond (alarm-deferred + (set! alarm-deferred #f) + (alarm-interrupt)))) + +;;; Make THE process queue. +(define process:queue (make-queue)) + +(define (alarm-interrupt) + (alarm 1) + (if ints-disabled (set! alarm-deferred #t) + (process:schedule!))) |