|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 3670 (0xe56)
Types: TextFile
Names: »process.scm.2«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/gnu-31mar87/scheme/scm/process.scm.2«
;;; -*-Scheme-*-
;;;
;;; Copyright (c) 1986 Massachusetts Institute of Technology
;;;
;;; This material was developed by the Scheme project at the
;;; Massachusetts Institute of Technology, Department of
;;; Electrical Engineering and Computer Science. 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. Users of this software agree to make their best efforts (a)
;;; to return to the MIT Scheme project any improvements or
;;; extensions that they make, so that these may be included in
;;; future releases; and (b) to inform MIT of noteworthy uses of
;;; this software.
;;;
;;; 3. All materials developed as a consequence of the use of
;;; this software shall duly acknowledge such use, in accordance
;;; with the usual standards of acknowledging credit in academic
;;; research.
;;;
;;; 4. MIT has made no warrantee or representation that the
;;; operation of this software will be error-free, and MIT is
;;; under no obligation to provide any services, by way of
;;; maintenance, update, or otherwise.
;;;
;;; 5. In conjunction with products arising from the use of this
;;; material, there shall be no use of the name of the
;;; Massachusetts Institute of Technology nor of any adaptation
;;; thereof in any advertising, promotional, or sales literature
;;; without prior written consent from MIT in each case.
;;;
(declare (usual-integrations))
\f
;;; Job control interface for UNIX. The microcode is hairy, and
;;; this stuff is dangerous. Use carefully.
(define primitive-spawn
(make-primitive-procedure 'spawn #!true))
(define primitive-wait
(make-primitive-procedure 'wait #!true))
(define primitive-signal
(make-primitive-procedure 'signal #!true))
(define primitive-pause
(make-primitive-procedure 'pause #!true))
(define exec
(make-primitive-procedure 'exec #!true))
;;; Interface to Status information from wait:
(define (process-number status)
(vector-ref status 0))
(define (process-signal status)
(vector-ref status 1))
(define (process-return-code status)
(vector-ref status 2))
;; The following code is somewhat poor. It check all signals that have
;; not yet been reported to see if the process of interest has gotten
;; a signal that caused termination. Hence, we are losing information
;; when we do this check as we just throw away the information about
;; the other signals. The right thing to do would be to store in a buffer
;; the uninteresting status information in case it becomes intersting
;; later.
(define (runnable? process)
(let ((status (primitive-wait)))
(cond ((= process (process-number status))
(if (process-return-code status)
#!false
(runnable? process)))
((disjunction (zero? (process-number status))
(= -1 (process-number status)))
#!true)
(else (runnable? process)))))
;;; (MAKE-RESTARTABLE-PROCESS string) returns a procedure that when
;;; called runs the given string or restarts a process that was started
;;; by the earlier calling of this procedure.
(define (make-restartable-process string)
(let ((process '()))
(lambda ()
(if process
(if (runnable? process)
(primitive-signal process 19)
(sequence
(princ
"Starting a new process because the old one has died.")
(set! process (primitive-spawn string))))
(set! process (primitive-spawn string)))
(primitive-pause)
(let ((status (primitive-wait)))
(if (process-return-code status)
(set! process '()))))))