#include <sys/types.h> #include <sys/conf.h> int untimeout(int id);
Architecture independent level 1 (DDI/DKI).
untimeout() returns -1 if the id is not found. Otherwise, it returns an integer value greater than or equal to 0.
untimeout() can be called from user or interrupt context.
static void xxtimeout_handler(caddr_t arg) { struct xxstate *xsp = (struct xxstate *)arg; mutex_enter(&xsp->lock); cv_signal(&xsp->cv); xsp->timeout_id = 0; xsp->flags |= TIMED_OUT; mutex_exit(&xsp->lock); } static u_int xxintr(caddr_t arg) { struct xxstate *xsp = (struct xxstate *)arg; . . . mutex_enter(&xsp->lock); if (xsp->timeout_id != 0) { (void) untimeout(xsp->timeout_id); xsp->timeout_id = 0; } /* Service interrupt */ cv_signal(&xsp->cv); mutex_exit(&xsp->lock); return(DDI_INTR_CLAIMED); } static void xxcheckcond(struct xxstate *xsp) { . . . mutex_enter(&xsp->lock); xsp->timeout_id = timeout(xxtimeout_handler, (caddr_t)xsp, (5 * drv_usectohz(1000000)); while (/* Waiting for interrupt or timeout*/) cv_wait(&xsp->cv, &xsp->lock); if (xsp->flags & TIMED_OUT) cmn_err(CE_WARN, "Device not responding"); . . . mutex_exit(&xsp->lock); . . . }