file: 01-C-event.t package: muf status: alpha
This function is invoked by the ]signal
primitive to do the work of actually generating a list
of all active handlers, then sequentially invokes each
handler appropriate to the given event, most recent
binding first, until one doesn't return.  If all
return, ]doSignal returns nothing.
The in-server signal[ operator itself
merely handles the necessary magic to pass the
event block between jobs, if needed, then
invokes the in-db ]doSignal function to do
the rest of the work.
Customization of ]doSignal is possible:
]signal actually runs whatever function it
finds in the @$s.doSignal property of the
recipient job.  You may set this property to
anything you like.  If it is not set to a valid
compiledFunction object, ]signal
will silently ignore all events raised.
The ]doSignal function is currently implemented as:
:   ]doSignal
    ( This function is the default value of   )
    ( @$s.doSignal, and hence gets called by )
    ( the server when delivering a signal to  )
    ( the job.                                )
    :event |get -> event
    |getAllActiveHandlers[
        -> k
        -> hi
        -> lo
        for i from lo below hi do{
            i     dupBth -> eventN
            i k + dupBth -> handlerN
            .err.event event = if
                handlerN ]invokeHandler
            else
                event eventN childOf? if
                    handlerN ]invokeHandler
            fi  fi
        }
    ]pop
    ]pop
;
(The special .err.event event = if hack
is partial enforcement of the CommonLisp requirement that
all events inherit from .err.event:  This
hack at least guarantees that a handler set on
.err.event will catch all signals.)
Go to the first, previous, next, last section, table of contents.