Sun Microsystems, Inc.
spacerspacer
spacer   www.sun.com docs.sun.com | | |  
spacer
black dot
   
A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z
    
 
Kernel Functions for Driverstimeout(9F)


NAME

 timeout - execute a function after a specified length of time

SYNOPSIS

 
#include <sys/types.h>
#include <sys/conf.h>
timeout_id_t timeout(void (* func)(void *), void *arg, clock_t ticks);

INTERFACE LEVEL

 

Architecture independent level 1 (DDI/DKI).

PARAMETERS

 
func
Kernel function to invoke when the time increment expires.
arg
Argument to the function.
ticks
Number of clock ticks to wait before the function is called. Use drv_usectohz(9F) to convert microseconds to clock ticks.

DESCRIPTION

 

The timeout() function schedules the specified function to be called after a specified time interval. The exact time interval over which the timeout takes effect cannot be guaranteed, but the value given is a close approximation.

The function called by timeout() must adhere to the same restrictions as a driver soft interrupt handler.

The function called by timeout() is run in interrupt context and must not sleep or call other functions that might sleep.

The delay(9F) function calls timeout(). Because timeout() is subject to priority inversion, drivers waiting on behalf of processes with real-time constraints should use cv_timedwait(9F) rather than delay().

RETURN VALUES

 

timeout() returns an opaque non-zero timeout identifier that can be passed to untimeout(9F) to cancel the request.

CONTEXT

 

timeout() can be called from user or interrupt context.

EXAMPLES

 Example 1. Using timeout
 

In the following example, the device driver has issued an IO request and is waiting for the device to respond. If the device does not respond within 5 seconds, the device driver will print out an error message to the console.

 

static void
xxtimeout_handler(void *arg)
{
        struct xxstate *xsp = (struct xxstate *)arg;
        mutex_enter(&xsp->lock);
        cv_signal(&xsp->cv);
        xsp->flags |= TIMED_OUT;
        mutex_exit(&xsp->lock);
        xsp->timeout_id = 0;
}
static uint_t
xxintr(caddr_t arg)
{
        struct xxstate *xsp = (struct xxstate *)arg;
         .
         .
         .
        mutex_enter(&xsp->lock);
        /* Service interrupt */
        cv_signal(&xsp->cv);
        mutex_exit(&xsp->lock);
        if (xsp->timeout_id != 0) {
                (void) untimeout(xsp->timeout_id);
                xsp->timeout_id = 0;
        }
        return(DDI_INTR_CLAIMED);
}
static void
xxcheckcond(struct xxstate *xsp)
{
         .
         .
         .
        xsp->timeout_id = timeout(xxtimeout_handler,
            xsp, (5 * drv_usectohz(1000000)));
        mutex_enter(&xsp->lock);
        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);
         .
         .
         .
}   

SEE ALSO

 

bufcall(9F), cv_timedwait(9F), ddi_in_panic(9F), delay(9F), drv_usectohz(9F), untimeout(9F)

Writing Device Drivers


SunOS 5.9Go To TopLast Changed 15 Oct 2001

 
      
      
Copyright 2002 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.