iv_event provides a way for delivering events to ivykis(3) recipients across thread boundaries.
The intended event recipient calls IV_EVENT_INIT on a structiv_event object, fills in ->cookie and
->handler, and then calls iv_event_register on the object.
To generate an event, call iv_event_post on the previously initialized structiv_event object. This will
cause the callback specified by ->handler to be called in the thread that the structiv_event object was
registered in, with ->cookie as its sole argument.
To deinitialize a structiv_event object, call iv_event_unregister from the same thread that
iv_event_register was called from on that object.
It is permitted to unregister a structiv_event object from any ivykis callback function in the thread it
was registered in, including from a callback function triggered by this object, and it is permitted to
free the memory corresponding to an unregistered object from its own callback function.
iv_event_post can be called from the same thread that iv_event_register was called from, or from a
different thread within the same process, but can not be called from a different process, and can not be
called from signal handlers. If you need this functionality, look at iv_event_raw(3).
Internally, iv_event is implemented as a wrapper around iv_event_raw(3), and multiplexes multiple structiv_event objects over per-thread structiv_event_raw objects, to save file descriptors and kernel
resources.