1997-09-21 22:12:19 +00:00
|
|
|
.\" $NetBSD: timeout.9,v 1.2 1996/06/23 22:32:34 pk Exp $
|
1996-04-13 16:59:07 +00:00
|
|
|
.\"
|
1997-09-21 22:12:19 +00:00
|
|
|
.\" Copyright (c) 1996 The NetBSD Foundation, Inc.
|
1996-04-13 16:59:07 +00:00
|
|
|
.\" All rights reserved.
|
|
|
|
.\"
|
1997-09-21 22:12:19 +00:00
|
|
|
.\" This code is derived from software contributed to The NetBSD Foundation
|
|
|
|
.\" by Paul Kranenburg.
|
|
|
|
.\"
|
1996-04-13 16:59:07 +00:00
|
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
|
|
.\" modification, are permitted provided that the following conditions
|
|
|
|
.\" are met:
|
|
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
|
|
.\" documentation and/or other materials provided with the distribution.
|
1997-09-21 22:12:19 +00:00
|
|
|
.\" 3. All advertising materials mentioning features or use of this software
|
|
|
|
.\" must display the following acknowledgement:
|
|
|
|
.\" This product includes software developed by the NetBSD
|
|
|
|
.\" Foundation, Inc. and its contributors.
|
|
|
|
.\" 4. Neither the name of The NetBSD Foundation nor the names of its
|
|
|
|
.\" contributors may be used to endorse or promote products derived
|
|
|
|
.\" from this software without specific prior written permission.
|
1996-04-13 16:59:07 +00:00
|
|
|
.\"
|
1997-09-21 22:12:19 +00:00
|
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
|
|
|
.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
|
|
.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
|
|
.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
|
|
|
|
.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
|
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
.\" POSSIBILITY OF SUCH DAMAGE.
|
1996-04-13 16:59:07 +00:00
|
|
|
.\"
|
1999-08-28 00:22:10 +00:00
|
|
|
.\" $FreeBSD$
|
1998-01-16 18:45:52 +00:00
|
|
|
.\"
|
1997-09-21 22:12:19 +00:00
|
|
|
.Dd September 10, 1996
|
1996-04-13 16:59:07 +00:00
|
|
|
.Dt TIMEOUT 9
|
2001-07-10 15:31:11 +00:00
|
|
|
.Os
|
1996-04-13 16:59:07 +00:00
|
|
|
.Sh NAME
|
2000-08-16 19:53:38 +00:00
|
|
|
.Nm timeout ,
|
|
|
|
.Nm untimeout ,
|
|
|
|
.Nm callout_handle_init ,
|
|
|
|
.Nm callout_init ,
|
|
|
|
.Nm callout_stop ,
|
2004-04-06 23:08:49 +00:00
|
|
|
.Nm callout_drain ,
|
2000-08-16 19:53:38 +00:00
|
|
|
.Nm callout_reset
|
1997-09-21 22:12:19 +00:00
|
|
|
.Nd execute a function after a specified length of time
|
1996-04-13 16:59:07 +00:00
|
|
|
.Sh SYNOPSIS
|
2001-10-01 16:09:29 +00:00
|
|
|
.In sys/types.h
|
|
|
|
.In sys/systm.h
|
2000-12-29 09:18:45 +00:00
|
|
|
.Pp
|
|
|
|
.Bd -literal
|
|
|
|
typedef void timeout_t (void *);
|
|
|
|
.Ed
|
1997-09-21 22:12:19 +00:00
|
|
|
.Ft struct callout_handle
|
1998-01-16 18:45:52 +00:00
|
|
|
.Fn timeout "timeout_t *func" "void *arg" "int ticks"
|
1996-04-13 16:59:07 +00:00
|
|
|
.Ft void
|
1999-12-27 16:22:20 +00:00
|
|
|
.Fn callout_handle_init "struct callout_handle *handle"
|
2000-12-29 09:18:45 +00:00
|
|
|
.Pp
|
|
|
|
.Bd -literal
|
|
|
|
struct callout_handle handle = CALLOUT_HANDLE_INITIALIZER(&handle)
|
|
|
|
.Ed
|
1996-04-13 16:59:07 +00:00
|
|
|
.Ft void
|
1998-01-16 18:45:52 +00:00
|
|
|
.Fn untimeout "timeout_t *func" "void *arg" "struct callout_handle handle"
|
1999-12-27 16:22:20 +00:00
|
|
|
.Ft void
|
2001-01-31 12:17:45 +00:00
|
|
|
.Fn callout_init "struct callout *c" "int mpsafe"
|
2001-08-23 23:52:59 +00:00
|
|
|
.Ft int
|
1999-12-27 16:22:20 +00:00
|
|
|
.Fn callout_stop "struct callout *c"
|
2004-04-06 23:08:49 +00:00
|
|
|
.Ft int
|
|
|
|
.Fn callout_drain "struct callout *c"
|
1999-12-27 16:22:20 +00:00
|
|
|
.Ft void
|
|
|
|
.Fn callout_reset "struct callout *c" "int ticks" "timeout_t *func" "void *arg"
|
1996-04-13 16:59:07 +00:00
|
|
|
.Sh DESCRIPTION
|
1997-09-21 22:12:19 +00:00
|
|
|
The function
|
|
|
|
.Fn timeout
|
|
|
|
schedules a call to the function given by the argument
|
|
|
|
.Fa func
|
|
|
|
to take place after
|
|
|
|
.Fa ticks Ns No /hz
|
1999-12-27 16:22:20 +00:00
|
|
|
seconds.
|
|
|
|
Non-positive values of
|
1997-09-21 22:12:19 +00:00
|
|
|
.Fa ticks
|
|
|
|
are silently converted to the value
|
|
|
|
.Sq 1 .
|
|
|
|
.Fa func
|
|
|
|
should be a pointer to a function that takes a
|
|
|
|
.Fa void *
|
|
|
|
argument.
|
|
|
|
Upon invocation,
|
|
|
|
.Fa func
|
|
|
|
will receive
|
|
|
|
.Fa arg
|
1999-12-27 16:22:20 +00:00
|
|
|
as its only argument.
|
1997-09-21 22:12:19 +00:00
|
|
|
The return value from
|
|
|
|
.Fn timeout
|
|
|
|
is a
|
|
|
|
.Ft struct callout_handle
|
2001-07-14 19:41:16 +00:00
|
|
|
which can be used in conjunction with the
|
1997-09-21 22:12:19 +00:00
|
|
|
.Fn untimeout
|
|
|
|
function to request that a scheduled timeout be canceled.
|
2003-10-01 21:32:42 +00:00
|
|
|
The
|
|
|
|
.Fn timeout
|
|
|
|
call is the old style and new code should use the callout_* functions.
|
1996-04-13 16:59:07 +00:00
|
|
|
.Pp
|
1997-09-21 22:12:19 +00:00
|
|
|
The function
|
|
|
|
.Fn callout_handle_init
|
|
|
|
can be used to initialize a handle to a state which will cause
|
|
|
|
any calls to untimeout with that handle to return with no side
|
|
|
|
effects.
|
|
|
|
.Pp
|
|
|
|
Assigning a callout handle the value of
|
|
|
|
.Fn CALLOUT_HANDLE_INITIALIZER
|
|
|
|
performs the same function as
|
|
|
|
.Fn callout_handle_init
|
|
|
|
and is provided for use on statically declared or global callout handles.
|
|
|
|
.Pp
|
|
|
|
The function
|
|
|
|
.Fn untimeout
|
|
|
|
cancels the timeout associated with
|
|
|
|
.Fa handle
|
|
|
|
using the
|
|
|
|
.Fa func
|
1996-04-13 16:59:07 +00:00
|
|
|
and
|
1997-09-21 22:12:19 +00:00
|
|
|
.Fa arg
|
|
|
|
arguments to validate the handle.
|
|
|
|
If the handle does not correspond to a timeout with
|
|
|
|
the function
|
|
|
|
.Fa func
|
|
|
|
taking the argument
|
|
|
|
.Fa arg
|
|
|
|
no action is taken.
|
|
|
|
.Fa handle
|
|
|
|
must be initialized by a previous call to
|
|
|
|
.Fn timeout ,
|
|
|
|
.Fn callout_handle_init ,
|
|
|
|
or assigned the value of
|
|
|
|
.Fn CALLOUT_HANDLE_INITIALIZER "&handle"
|
|
|
|
before being passed to
|
|
|
|
.Fn untimeout .
|
|
|
|
The behavior of calling untimeout without a previously initialized handle
|
|
|
|
is undefined.
|
2003-10-01 21:32:42 +00:00
|
|
|
The
|
|
|
|
.Fn untimeout
|
|
|
|
call is the old style and new code should use the callout_* functions.
|
1996-04-13 16:59:07 +00:00
|
|
|
.Pp
|
1997-09-21 22:12:19 +00:00
|
|
|
As handles are recycled by the system, it is possible (although unlikely)
|
|
|
|
that a handle from one invocation of
|
|
|
|
.Fn timeout
|
|
|
|
may match the handle of another invocation of
|
|
|
|
.Fn timeout
|
|
|
|
if both calls used the same function pointer and argument, and the first
|
|
|
|
timeout is expired or canceled before the second call.
|
|
|
|
The timeout facility offers O(1) running time for
|
1996-04-13 16:59:07 +00:00
|
|
|
.Fn timeout
|
|
|
|
and
|
1997-09-21 22:12:19 +00:00
|
|
|
.Fn untimeout .
|
|
|
|
Timeouts are executed from
|
|
|
|
.Fn softclock
|
1999-12-27 16:22:20 +00:00
|
|
|
at
|
|
|
|
.Fn splsoftclock .
|
|
|
|
Thus they are protected from re-entrancy.
|
|
|
|
.Pp
|
|
|
|
The functions
|
|
|
|
.Fn callout_init ,
|
2004-04-06 23:08:49 +00:00
|
|
|
.Fn callout_stop ,
|
|
|
|
.Fn callout_drain
|
1999-12-27 16:22:20 +00:00
|
|
|
and
|
|
|
|
.Fn callout_reset
|
2001-07-14 19:41:16 +00:00
|
|
|
are low-level routines for clients who wish to allocate their own
|
1999-12-27 16:22:20 +00:00
|
|
|
callout structures.
|
|
|
|
.Pp
|
|
|
|
The function
|
|
|
|
.Fn callout_init
|
|
|
|
initializes a callout so it can be passed to
|
2004-04-06 23:08:49 +00:00
|
|
|
.Fn callout_stop ,
|
|
|
|
.Fn callout_drain
|
1999-12-27 16:22:20 +00:00
|
|
|
or
|
|
|
|
.Fn callout_reset
|
|
|
|
without any side effects.
|
2001-01-31 12:17:45 +00:00
|
|
|
If the
|
|
|
|
.Fa mpsafe
|
|
|
|
argument is zero,
|
|
|
|
the callout structure is not considered to be
|
|
|
|
.Dq multi-processor safe ;
|
|
|
|
that is,
|
|
|
|
the Giant lock will be acquired before calling the callout function,
|
|
|
|
and released when the callout function returns.
|
1999-12-27 16:22:20 +00:00
|
|
|
.Pp
|
|
|
|
The function
|
|
|
|
.Fn callout_stop
|
|
|
|
cancels a callout if it is currently pending.
|
2001-08-23 23:52:59 +00:00
|
|
|
If the callout is pending, then
|
|
|
|
.Fn callout_stop
|
|
|
|
will return a non-zero value.
|
|
|
|
If the callout has already been serviced or is currently being serviced,
|
|
|
|
then zero will be returned.
|
1999-12-27 16:22:20 +00:00
|
|
|
.Pp
|
|
|
|
The function
|
2004-04-06 23:08:49 +00:00
|
|
|
.Fn callout_drain
|
|
|
|
is identical to
|
|
|
|
.Fn callout_stop
|
|
|
|
except that it will wait for the callout to be completed if it is
|
2004-05-05 10:47:19 +00:00
|
|
|
already in progress.
|
|
|
|
This function MUST NOT be called while holding any
|
2004-04-06 23:08:49 +00:00
|
|
|
locks on which the callout might block, or deadlock will result.
|
|
|
|
.Pp
|
|
|
|
The function
|
1999-12-27 16:22:20 +00:00
|
|
|
.Fn callout_reset
|
|
|
|
first calls
|
|
|
|
.Fn callout_stop
|
|
|
|
to disestablish the callout, and then establishes a new callout in the
|
2001-07-14 19:41:16 +00:00
|
|
|
same manner as
|
1999-12-27 16:22:20 +00:00
|
|
|
.Fn timeout .
|
2001-08-23 23:52:59 +00:00
|
|
|
.Sh RETURN VALUES
|
|
|
|
The
|
|
|
|
.Fn timeout
|
|
|
|
function returns a
|
|
|
|
.Ft struct callout_handle
|
|
|
|
that can be passed to
|
|
|
|
.Fn untimeout .
|
|
|
|
The
|
|
|
|
.Fn callout_stop
|
2004-04-06 23:08:49 +00:00
|
|
|
and
|
|
|
|
.Fn callout_drain
|
|
|
|
functions return non-zero if the callout was still pending when it was
|
2003-10-01 21:32:42 +00:00
|
|
|
called or zero otherwise.
|
1996-04-13 16:59:07 +00:00
|
|
|
.Sh HISTORY
|
1997-09-21 22:12:19 +00:00
|
|
|
The current timeout and untimeout routines are based on the work of
|
2000-11-14 11:20:58 +00:00
|
|
|
.An Adam M. Costello
|
|
|
|
and
|
|
|
|
.An George Varghese ,
|
|
|
|
published in a technical report entitled
|
1997-09-21 22:12:19 +00:00
|
|
|
.%T "Redesigning the BSD Callout and Timer Facilities"
|
2000-11-14 11:20:58 +00:00
|
|
|
and modified slightly for inclusion in
|
|
|
|
.Fx
|
|
|
|
by
|
|
|
|
.An Justin T. Gibbs .
|
1997-09-21 22:12:19 +00:00
|
|
|
The original work on the data structures used in this implementation
|
2000-11-14 11:20:58 +00:00
|
|
|
was published by
|
|
|
|
.An G. Varghese
|
|
|
|
and
|
|
|
|
.An A. Lauck
|
|
|
|
in the paper
|
2001-07-14 19:41:16 +00:00
|
|
|
.%T "Hashed and Hierarchical Timing Wheels: Data Structures for the Efficient Implementation of a Timer Facility"
|
1997-09-21 22:12:19 +00:00
|
|
|
in the
|
|
|
|
.%B "Proceedings of the 11th ACM Annual Symposium on Operating Systems Principles" .
|
2001-08-14 10:01:54 +00:00
|
|
|
The current implementation replaces the long standing
|
|
|
|
.Bx
|
|
|
|
linked list
|
1997-09-21 22:12:19 +00:00
|
|
|
callout mechanism which offered O(n) insertion and removal running time
|
|
|
|
but did not generate or require handles for untimeout operations.
|