This version of this document is no longer maintained. For the latest documentation, see http://www.qnx.com/developers/docs. |
Structure that describes an event
#include <sys/siginfo.h> union sigval { int sival_int; void * sival_ptr; };
The sigevent structure is complicated; see below.
This structure describes an event. The int sigev_notify member indicates how the notification is to occur, as well as which of the other members are used:
sigev_notify | sigev_signo | sigev_coid | sigev_priority | sigev_code | sigev_value |
---|---|---|---|---|---|
SIGEV_INTR | |||||
SIGEV_NONE | |||||
SIGEV_PULSE | Connection | Priority | Code | Value | |
SIGEV_SIGNAL | Signal | ||||
SIGEV_SIGNAL_CODE | Signal | Code | Value | ||
SIGEV_SIGNAL_THREAD | Signal | Code | Value | ||
SIGEV_THREAD (special -- see below) |
Value | ||||
SIGEV_UNBLOCK |
The <sys/siginfo.h> file also defines some macros to make initializing the sigevent structure easier. All the macros take a pointer to a sigevent structure as their first argument, event, and set the sigev_notify member to the appropriate value.
|
Send an interrupt notification to a specific thread. No other fields in the structure are used.
The initialization macro is:
SIGEV_INTR_INIT( &event )
Don't send any notification. No other fields in the structure are used.
The initialization macro is:
SIGEV_NONE_INIT( &event )
Send a pulse. The following fields are used:
If you want the thread that receives the pulse to run at the initial priority of the process, set sigev_priority to SIGEV_PULSE_PRIO_INHERIT.
The initialization macro is:
SIGEV_PULSE_INIT( &event, coid, priority, code, value )
Send a signal to a process. The following fields are used:
The initialization macro is:
SIGEV_SIGNAL_INIT( &event, signal )
If you need to set the sigev_value for a SIGEV_SIGNAL event (for example if SA_SIGINFO is set), you can use this macro:
SIGEV_SIGNAL_VALUE_INIT( &event, signal, value )
This is similar to SIGEV_SIGNAL, except that SIGEV_SIGNAL_CODE also includes a value and a code. The following fields are used:
The initialization macro is:
SIGEV_SIGNAL_CODE_INIT( &event, signal, value, code )
Send a signal to a specific thread. The following fields are used:
The initialization macro is:
SIGEV_SIGNAL_THREAD_INIT( &event, signal, value, code )
Create a new thread.
We don't recommend using this type of event. Pulses are more efficient. |
The following fields are used:
The initialization macro is:
SIGEV_THREAD_INIT( &event, fn, value, attr )
Force a thread to become unblocked. No other fields in the structure are used.
The initialization macro is:
SIGEV_UNBLOCK_INIT( &event )
If you're using adaptive partitioning, you can use a sigevent to make a thread run as critical or not.
This feature was added in the QNX Neutrino Core OS 6.3.2. In order to use adaptive partitioning, you need to install the Adaptive Partitioning Technology Development Kit. For more information, see the Adaptive Partitioning User's Guide. |
After setting up the sigevent structure as appropriate, use these macros to set or clear the hidden bit that makes a thread run as critical or not:
The receiving thread doesn't have to do anything to make itself critical or noncritical; the adaptive partitioning scheduler does this automatically.
These macros use hidden bits in the sigev_notify member of the sigevent structure. Don't compare this member directly to a value; use the SIGEV_GET_TYPE() macro instead, as described above. |
ds_create(), InterruptAttach(), InterruptAttachEvent(), iofunc_notify(), iofunc_notify_trigger(), ionotify(), lio_listio(), mq_notify(), MsgDeliverEvent(), procmgr_event_notify(), _pulse, TimerCreate(), timer_create(), TimerInfo(), TimerTimeout(), timer_timeout()
"Neutrino IPC" in the Neutrino microkernel chapter of the System Architecture guide
Adaptive Partitioning User's Guide