LWM running non-mp safe code after mp is started
Is there a general way to execute arbitrary code in the context of the
initial thread of a LispWorks image after mutliprocessing has been
enabled and the REPL is running in its own thread?
Said another way, I'd like to be able to send the initial thread (via a
mailbox or something) an arbitrary form to run after the LispWorks
environment is fully started (is the initial thread the "The idle
process" Priority -536870912 State "Running (preempted)" process?).
The context is a foreign function interface for the CoreMIDI library on
Mac OS X (10.3.7). The problem I have run into is that calling
CoreMIDI's MIDIRestart() function to initialize the sytem fails if
multiprocessing has already been started (which is that case for the
default LispWorks.app image).
The error I get is:
CoreMIDI: timeout waiting for MIDIServer to start
-10839
However if I use an image which does not start multiprocessing by
default calling MIDIRestart() succeeds. Once the CoreMIDI library is
initialized then enabling multiprocessing does not cause any problems.
What I suspect is happening is that when multiprocessing is enabled the
handshake between the CoreMIDI library and the external MIDIServer
process is failing because the MIDIServer is responding (via a Mach IPC
message) to the wrong thread (again I'm just speculating).
The current hack I have which works for a tty based image involves
building a special image which calls MIDIRestart() on startup using an
action. While this basically works I would like to avoid the additional
1-2 seconds of startup time and avoid the need to maintain a special
image. Using the following to create the image:
=======================================
(load-all-patches)
(defvar *midi-server-status* nil)
(fli:define-foreign-function (midi-restart "MIDIRestart" :source)
nil
:result-type :long
:language :ansi-c)
(defun midi-startup ()
(format t "Starting MIDIServer...")
(fli:register-module
"/System/Library/Frameworks/CoreMIDI.framework/CoreMIDI")
(setf *midi-server-status* (midi-restart))
(format t " done.~%"))
(define-action "When starting image" "MIDI Startup" 'midi-startup
:after "System starup completed")
(save-image "./lispworks-midi" :environment nil :multiprocessing t)
(quit)
=========================================
Results in:
% ./lispworks-midi
Starting MIDIServer... done.
LispWorks(R): The Common Lisp Programming Environment
Copyright (C) 1987-2004 Xanalys Inc. All rights reserved.
Version 4.4.0
Saved by greg as lispworks-midi, at 29 Dec 2004 16:15
User greg on evasion.local
; Loading text file /Applications/LispWorks
4.4/Library/lib/4-4-0-0/config/siteinit.lisp
; Loading text file /Applications/LispWorks
4.4/Library/lib/4-4-0-0/private-patches/load.lisp
CL-USER 1 > *midi-server-status*
0 ;; <- this means the startup was successful
Any help/advice would be greatly appreciated.
Thanks
-greg
_______________________________________________________
Greg Wuller greg@wuller.com
_______________________________________________________