DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T p

⟦ba66f33a1⟧ TextFile

    Length: 3670 (0xe56)
    Types: TextFile
    Names: »process.scm.2«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/gnu-31mar87/scheme/scm/process.scm.2« 

TextFile

;;; -*-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 '()))))))