Structure that describes an event
The sigevent structure, which is defined in <sys/siginfo.h>, 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.
if( my_event.sigev_notify == SIGEV_PULSE)
use:
if( SIGEV_GET_TYPE(&my_event) == SIGEV_PULSE)
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, depending on the situation:
In the case of timers, SyncMutexEvent(), and interrupts, if the thread dies before the event gets delivered, the kernel sends the signal to a random thread in the same process.
The following fields are used:
The initialization macro is:
SIGEV_SIGNAL_THREAD_INIT( &event, signal, value, code )
Create a new thread.
The following fields are used:
The initialization macro is:
SIGEV_THREAD_INIT( &event, fn, value, attr )
The sigval union is defined as follows:
union sigval { int sival_int; void * sival_ptr; };
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.
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.