ose_erl_driver
Writing Linked-in drivers that also work on Enea OSE is very similar for how you would do it for Unix. The difference from Unix is that driver_select, ready_input and ready_output all work with signals instead of file descriptors. This means that the driver_select is used to specify which type of signal should trigger calls to ready_input/ready_output. The functions described below are available to driver programmers on Enea OSE to facilitate this.
DATA TYPES
ErlDrvEvent
is a handle to a signal number and id combination. It is passed to driver_select(3).Functions
union SIGNAL * erl_drv_ose_get_signal(ErlDrvEvent drv_event)
Fetch the next signal associated with drv_event
.
Signals will be returned in the order which they were received and
when no more signals are available NULL
will be returned.
Use this function in the ready_input/ready_output callbacks
to get signals.
ErlDrvEvent erl_drv_ose_event_alloc(SIGSELECT signo, ErlDrvOseEventId id, ErlDrvOseEventId (*resolve_signal)(union SIGNAL* sig), void *extra)
Create a new ErlDrvEvent
associated with signo
,
id
and uses the resolve_signal
function to extract
the id
from a signal with signo
. The extra
parameter can be used for additional data. See
Signals in a Linked-in driver in the OSE User's Guide.
void erl_drv_ose_event_free(ErlDrvEvent drv_event)
Free a ErlDrvEvent
. This should always be done in the
stop_select
callback when the event is no longer being used.
void erl_drv_ose_event_fetch(ErlDrvEvent drv_event, SIGSELECT *signo, ErlDrvOseEventId *id, void **extra)
Write the signal number, id and any extra data associated with drv_event
into *signo
and *id
respectively. NULL
can be
also passed as signo
or id
in order to ignore that field.