1999-09-14 08:45:02 -04:00
|
|
|
; Copyright (c) 1993-1999 by Richard Kelsey and Jonathan Rees. See file COPYING.
|
|
|
|
; This file contains the type declarations for the VM's interface to
|
|
|
|
; unbuffered i/o. Unbuffered ports are called channels in the VM
|
|
|
|
; and FD's in the OS. The external names are unixoid, but the interface
|
|
|
|
; itself is intended to be portable.
|
|
|
|
|
|
|
|
(define current-input-channel
|
|
|
|
(external "STDIN_FD" (=> () integer)))
|
|
|
|
|
|
|
|
(define current-output-channel
|
|
|
|
(external "STDOUT_FD" (=> () integer)))
|
|
|
|
|
|
|
|
(define current-error-channel
|
|
|
|
(external "STDERR_FD" (=> () integer)))
|
|
|
|
|
|
|
|
; Converting between ports and channels.
|
|
|
|
|
|
|
|
(define input-port->channel
|
|
|
|
(external "fileno" (=> (input-port) integer)))
|
|
|
|
|
|
|
|
(define output-port->channel
|
|
|
|
(external "fileno" (=> (output-port) integer)))
|
|
|
|
|
|
|
|
(define input-channel->port
|
|
|
|
(external "PS_INPUT_FDOPEN" (=> (integer) input-port integer)))
|
|
|
|
|
|
|
|
(define output-channel->port
|
|
|
|
(external "PS_OUTPUT_FDOPEN" (=> (integer) output-port integer)))
|
|
|
|
|
|
|
|
; Opening and closing channels
|
|
|
|
|
|
|
|
(define open-file-channel
|
|
|
|
(external "ps_open_fd" (=> ((^ char) boolean) integer integer)))
|
|
|
|
|
|
|
|
(define (open-input-file-channel name)
|
|
|
|
(open-file-channel name #t))
|
|
|
|
|
|
|
|
(define (open-output-file-channel name)
|
|
|
|
(open-file-channel name #f))
|
|
|
|
|
|
|
|
(define close-channel
|
|
|
|
(external "ps_close_fd" (=> (integer) integer)))
|
|
|
|
|
|
|
|
(define close-input-channel close-channel)
|
|
|
|
(define close-output-channel close-channel)
|
|
|
|
|
2003-05-01 06:21:33 -04:00
|
|
|
; (channel-ready? channel read?)
|
|
|
|
; -> ready? status
|
|
|
|
|
|
|
|
(define channel-ready?
|
|
|
|
(external "ps_check_fd"
|
|
|
|
(=> (integer boolean) boolean integer)))
|
|
|
|
|
1999-09-14 08:45:02 -04:00
|
|
|
; Read and writing blocks of data
|
|
|
|
;
|
|
|
|
; (channel-read-block channel buffer count wait?)
|
|
|
|
; -> char-count eof? pending? status
|
|
|
|
;
|
|
|
|
; (channel-write-block channel buffer count)
|
|
|
|
; -> char-count eof? pending? status
|
|
|
|
;
|
|
|
|
; CHAR-COUNT - the number of characters read/written
|
|
|
|
; EOF? - char-count is ignored if this is true
|
|
|
|
; PENDING? - true if the operation cannot complete immediately
|
|
|
|
; STATUS - from an enumeration defined as part of Pre-Scheme
|
|
|
|
;
|
2003-05-01 06:21:33 -04:00
|
|
|
; Pending i/o operations produce i/o-{read,write}-completion events when they're done.
|
1999-09-14 08:45:02 -04:00
|
|
|
|
|
|
|
(define channel-read-block
|
|
|
|
(external "ps_read_fd"
|
|
|
|
(=> (integer address integer boolean) integer boolean boolean integer)))
|
|
|
|
|
|
|
|
(define channel-write-block
|
|
|
|
(external "ps_write_fd"
|
|
|
|
(=> (integer address integer) integer boolean integer)))
|
|
|
|
|
|
|
|
(define channel-abort
|
|
|
|
(external "ps_abort_fd_op" (=> (integer) integer)))
|
|
|
|
|
2003-05-01 06:21:33 -04:00
|
|
|
; Checking a channel for data
|
|
|
|
|
|
|
|
(define add-pending-channel
|
|
|
|
(external "ps_add_pending_fd" (=> (integer boolean) boolean)))
|
|
|
|
|
1999-09-14 08:45:02 -04:00
|
|
|
;----------------------------------------------------------------
|
|
|
|
; Asynchronous external events
|
|
|
|
|
|
|
|
; The different kinds of events
|
|
|
|
|
|
|
|
(define-external-enumeration events
|
|
|
|
(keyboard-interrupt-event ; user interrupt
|
2003-05-01 06:21:33 -04:00
|
|
|
io-read-completion-event ; a pending read operation completed
|
|
|
|
io-write-completion-event ; a pending write operation completed
|
1999-09-14 08:45:02 -04:00
|
|
|
alarm-event ; scheduled interrupt
|
|
|
|
os-signal-event ; some OS signal of no interest to the VM occured
|
|
|
|
error-event ; OS error occurred
|
|
|
|
no-event ; no more pending events
|
|
|
|
))
|
|
|
|
|
|
|
|
; Initialize the event system
|
|
|
|
|
|
|
|
(define initialize-events
|
|
|
|
(external "interrupt_init" (=> () integer)))
|
|
|
|
|
|
|
|
; True if an event is pending
|
|
|
|
|
|
|
|
(define pending-event?
|
|
|
|
(external "pending_eventp" (=> () boolean)))
|
|
|
|
|
2003-05-01 06:21:33 -04:00
|
|
|
; Returns the next event. The second return value is the FD for
|
|
|
|
; i/o-{read,write}-completion events and the third is the status for
|
|
|
|
; i/o-{read,write}-completion and error events. (currently this is
|
|
|
|
; always zero for i/o-{read,write}-completions).
|
1999-09-14 08:45:02 -04:00
|
|
|
|
|
|
|
(define get-next-event
|
|
|
|
(external "s48_get_next_event" (=> () integer integer integer)))
|
|
|
|
|
|
|
|
; Wait for the next event. The two arguments are maximum time to wait and
|
|
|
|
; whether that time is in minutes (#T) or milliseconds (#F).
|
|
|
|
|
|
|
|
(define wait-for-event
|
|
|
|
(external "s48_wait_for_event" (=> (integer boolean) unit)))
|
|
|
|
|
|
|
|
|