Module: environment-framework
Synopsis: Environment Framework
Author: Andy Armstrong, Jason Trenouth, Chris Page
Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc.
All rights reserved.
License: Functional Objects Library Public License Version 1.0
Dual-license: GNU Lesser General Public License
Warranty: Distributed WITHOUT WARRANTY OF ANY KIND
/// PROTOCOL
define open generic frame-reusable?
(frame :: )
=> (reusable? :: );
define open generic frame-reusable?-setter
(resuable? :: , frame :: )
=> (reusable? :: );
define open generic reuse-frames?
(class :: subclass())
=> (reuse-frames? :: );
define open generic reuse-frames?-setter
(value :: , class :: subclass())
=> (value :: );
define open generic call-in-environment-frame
(function :: , portd :: , class :: subclass(), #rest initargs, #key, #all-keys)
=> ();
// obsolete (use ensure-environment-frame)
define open generic find-environment-frame
(portd :: , class :: subclass(), #key, #all-keys)
=> ();
define open generic ensure-environment-frame
(portd :: , class :: subclass(), #key, #all-keys)
=> ();
define open generic reuse-environment-frame (portd :: , class :: subclass(), #key, #all-keys)
=> (frame :: false-or());
define open generic find-matching-frames
(portd :: , class :: subclass(), #key, #all-keys)
=> (frames :: );
define open generic choose-matching-frame
(portd :: , class :: subclass(), #key, #all-keys)
=> (frame :: false-or());
define open generic choose-environment-frame
(portd :: , class :: subclass(), #key, #all-keys)
=> (frame :: false-or());
define open generic choose-current-frame
(portd :: , class :: subclass(), #key, #all-keys)
=> (frame :: false-or());
define open generic current-environment-frame
(portd :: )
=> (frame :: false-or());
define open generic reuse-matching-frame?
(portd :: , frame :: , class :: subclass(), #key, #all-keys)
=> (reuse? :: );
define open generic choose-frame
(portd :: , class :: subclass(), frames :: , #key, #all-keys)
=> (frame :: false-or());
define open generic reinitialize-frame
(frame :: , #key, #all-keys)
=> ();
define open generic fork-environment-frame
(portd :: , class :: subclass(), #key, #all-keys)
=> ();
define open generic make-environment-frame
(portd :: , class :: subclass(), #key, #all-keys)
=> (frame :: );
define open generic start-environment-frame
(frame :: )
=> ();
define open generic make-environment-thread
(portd :: , class :: subclass(), #key name :: , function :: )
=> ();
define open generic do-environment-frame
(frame :: , function :: false-or())
=> ();
define open generic frame-thread-name
(portd :: , class :: subclass())
=> (thread-name :: );
/// (internal)
define constant :: = type-union(, , );
/// PORT-DESIGNATOR-PORT (internal)
//--- cpage: 1998.10.09 These are currently unused. Why? Should we remove them altogether?
/*
define method port-designator-port (_port :: ) => (_port :: )
_port
end method;
define method port-designator-port (frame :: ) => (_port :: )
port(frame)
end method;
define method port-designator-port (display :: ) => (_port :: )
port(display)
end method;
*/
/// *REUSE-FRAMES?* (internal)
define variable *reuse-frames?* = #t;
/// *FRAME-REUSABLE?-DEFAULT* (internal)
define variable *frame-reusable?-default* = #t;
/// (environment-framework)
define open abstract class ()
slot frame-reusable? :: = *frame-reusable?-default*,
init-keyword: reusable?:;
end class ;
/// FRAME-REUSABLE? (environment-framework)
define method frame-reusable?
(frame :: ) => (reusable? :: )
#t
end method frame-reusable?;
/// REUSE-FRAMES? (environment-framework)
define method reuse-frames?
(class :: subclass()) => (reuse-frames? :: )
*reuse-frames?*
end method reuse-frames?;
define method reuse-frames?-setter
(value :: , class :: subclass()) => (value :: )
*reuse-frames?* := value
end method reuse-frames?-setter;
/// FRAME-REUSE MESSAGE CLASSES (environment-framework)
define open abstract class ()
end class ;
define class ()
constant slot message-frame :: false-or() = #f,
init-keyword: frame:;
end class ;
/// FIND-ENVIRONMENT-FRAME (environment-framework)
///
/// obsolete (use ensure-environment-frame)
define method find-environment-frame
(portd :: , class :: subclass(), #rest initargs, #key)
=> ()
apply(ensure-environment-frame, portd, class, initargs)
end method find-environment-frame;
/// ENSURE-ENVIRONMENT-FRAME (environment-framework)
define method ensure-environment-frame
(portd :: , class :: subclass(), #rest initargs, #key)
=> ()
apply(reuse-environment-frame, portd, class, initargs)
| apply(fork-environment-frame, portd, class, initargs)
end method ensure-environment-frame;
/// REUSE-ENVIRONMENT-FRAME (environment-framework)
define method reuse-environment-frame
(portd :: , class :: subclass(), #rest initargs, #key)
=> (frame :: false-or())
if (reuse-frames?(class))
let frame = apply(choose-environment-frame, portd, class, initargs);
if (frame)
apply-in-frame(frame, reinitialize-frame, frame, initargs);
call-in-frame(frame, do-environment-frame, frame, *environment-frame-function*);
frame
else
#f
end if;
else
#f
end if;
end method;
/// CHOOSE-ENVIRONMENT-FRAME (environment-framework)
define method choose-environment-frame
(portd :: , class :: subclass(), #rest initargs, #key)
=> (frame :: false-or())
apply(choose-current-frame, portd, class, initargs)
| apply(choose-matching-frame, portd, class, initargs);
end method;
/// CHOOSE-CURRENT-FRAME (environment-framework)
define method choose-current-frame (portd :: , class :: subclass(), #rest initargs, #key)
=> (frame :: false-or())
let frame = current-environment-frame(portd);
if (frame & apply(reuse-matching-frame?, portd, frame, class, initargs))
frame
end if;
end method;
/// CHOOSE-MATCHING-FRAME (environment-framework)
define method choose-matching-frame
(portd :: , class :: subclass(), #rest initargs, #key)
=> (frame :: false-or())
let frames = apply(find-matching-frames, portd, class, initargs);
apply(choose-frame, portd, class, frames, initargs);
end method;
/// $FORKED-FRAMES-LOCK (internal)
define constant $forking-environment-frames-lock = make();
/// WAIT-FOR-FORKED-FRAMES (internal)
define macro wait-for-forking-frames
{ wait-for-forking-frames (?class:expression)
?body:body
end }
=>
{ with-lock($forking-environment-frames-lock)
let forking-frame = find-forking-environment-frame(?class);
if (forking-frame)
if (wait-for(forking-frame.environment-frame-notification))
?body
end if;
else
?body
end if;
end }
end macro;
/// $FORKING-ENVIRONMENT-FRAMES (internal)
define variable *forking-environment-frames* :: = make();
/// (internal)
define sealed class (