Okay, so you receive this message with a receive ID of zero. What does it actually look like? From the <sys/neutrino.h> header file, here's the definition of the _pulse structure:
struct _pulse { uint16_t type; uint16_t subtype; int8_t code; uint8_t zero [3]; union sigval value; int32_t scoid; };
Both the type and subtype members are zero (a further indication that this is a pulse). The code and value members are set to whatever the sender of the pulse determined. Generally, the code will be an indication of why the pulse was sent; the value will be a 32-bit data value associated with the pulse. Those two fields are where the 40 bits of content comes from; the other fields aren't user adjustable.
The kernel reserves negative values of code, leaving 127 values for programmers to use as they see fit.
The value member is actually a union:
union sigval { int sival_int; void *sival_ptr; };
Therefore (expanding on the server example above), you often see code like:
#include <sys/neutrino.h> rcvid = MsgReceive (chid, … if (rcvid == 0) { // it's a pulse // determine the type of pulse switch (msg.pulse.code) { case MY_PULSE_TIMER: // One of your timers went off, do something // about it... break; case MY_PULSE_HWINT: // A hardware interrupt service routine sent // you a pulse. There's a value in the "value" // member that you need to examine: val = msg.pulse.value.sival_int; // Do something about it... break; case _PULSE_CODE_UNBLOCK: // A pulse from the kernel, indicating a client // unblock was received, do something about it... break; // etc... } else { // it's a regular message // determine the type of message // handle it }
This code assumes, of course, that you've set up your msg structure to contain a struct _pulse pulse; member, and that the manifest constants MY_PULSE_TIMER and MY_PULSE_HWINT are defined. The pulse code _PULSE_CODE_UNBLOCK is one of those negative-numbered kernel pulses mentioned above. You can find a complete list of them in <sys/neutrino.h> along with a brief description of the value field.