NAME | SYNOPSIS | API RESTRICTIONS | FEATURES | DESCRIPTION | RETURN VALUE | ERRORS | ATTRIBUTES | SEE ALSO
#include <exec/chExec.h>int svActorExcHandlerConnect(KnCap * actorcap, int vectindex, KnLapDesc * newhandler);
The function or functions documented here may not be used safely in all application contexts with all APIs provided in the ChorusOS 5.0 product.
See API(5FEA) for details.
CORE
The svActorExcHandler() calls are used to manage exception handlers associated with the actor whose capability is pointed to by actorcap . These calls are restricted to SUPERVISOR threads.
The svActorExcHandlerConnect() function duplicates the LAP descriptor pointed to by newhandler into the entry specified in the exception handler's vector.
The svActorExcHandlerDisconnect() function clears the LAP descriptor stored in the specified entry of the exception handlers vector. If curhandler is not equal to K_CONNECTED_LAP , it must point to a LAP descriptor identical to the lap descriptor currently installed.
The svActorExcHandlerGetConnected() function copies the LAP descriptor currently installed in the exception handler's vector to the location pointed to by curhandler .
Exception handlers are specified in the form of LAP descriptors (see svLapCreate(2K) .
As several subsystem managers may need to control exceptions which occur while a thread is executing within a given actor, the system keeps a vector of K_ACTOR_EXCVECT_MAX exception handlers per actor.
The vectindex parameter identifies which entry of this exception handler's vector should be used by the calls. The consistent allocation of vector indexes among subsystem managers is the responsibility of the subsystem managers. Depending on the subsystems, the last vector entry may be reserved for use by the application. For that purpose, the constant K_ACTOR_EXCVECT_LAST can be used independently of the system configuration to designate the index K_ACTOR_EXCVECT_MAX - 1 .
When a thread causes an exception, the system uses the exception handler's vector associated with the current execution actor of the faulting thread to recover from the exception. During this recovery phase, all valid exception handlers are invoked in sequence (see lapInvoke(2K) ), starting from index 0, until one of them succeeds in recovering from the exception (sets the status to K_EXC_COMPLETED ).
If the exception is not recovered after calling all the exception handlers, the system starts the termination phase where all exception handlers are called a second time in reverse order (starting from index K_ACTOR_EXCVECT_MAX - 1 ) until one of them takes a default action on the faulty thread (sets the K_EXC_COMPLETED status described below).
The argument of the LAP exception handler is a pointer to a KnActorExcDesc data structure. This structure has the following fields:
KnExcPhase excPhase ; KnExcStatus *excStatus ; int excNumber ; KnThreadCtx *threadCtx ; void *exceptionCtx ;
The excPhase field indicates the phase in which the handler was invoked, either K_EXC_RECOVER (recovery phase) or K_EXC_TERMINATE (termination phase).
The excStatus field can be used by the exception handler to indicate that the exception has been processed successfully. The exception handler is called with excStatus pointing to a status variable set to K_EXC_INPROGRESS . The handler indicates that it has completed the exception processing by setting this status variable to K_EXC_COMPLETED . In this case, no other exception handlers are be invoked.
The excNumber field is a processor-dependent exception number.
The threadCtx field gives access to the register context of the faulting thread. This context is processor-dependent. Exception handlers may modify the register context of the faulting thread to recover from the exception.
The exceptionCtx field provides access to additional data specific to the exception (for example, the fault address for a page fault). This context is processor- and exception- dependent.
On success, the calls return K_OK otherwise a negative error code is returned.
svActorExcHandlerConnect() is called and there is already a valid LAP descriptor installed in the entry specified of the exception handler's vector.
actorcap is an inconsistent actor capability or vectindex is invalid. The curhandler lap descriptor specified to svActorExcHandlerDisconnect() is not equal to K_CONNECTED_LAP and does not match the lap descriptor currently installed.
actorcap does not specify a local actor.
See attributes(5) for descriptions of the following attributes:
ATTRIBUTE TYPE | ATTRIBUTE VALUE |
---|---|
Interface Stability | Evolving |
NAME | SYNOPSIS | API RESTRICTIONS | FEATURES | DESCRIPTION | RETURN VALUE | ERRORS | ATTRIBUTES | SEE ALSO