summaryrefslogtreecommitdiff
path: root/static/openbsd/man9/timeout.9
diff options
context:
space:
mode:
Diffstat (limited to 'static/openbsd/man9/timeout.9')
-rw-r--r--static/openbsd/man9/timeout.9419
1 files changed, 419 insertions, 0 deletions
diff --git a/static/openbsd/man9/timeout.9 b/static/openbsd/man9/timeout.9
new file mode 100644
index 00000000..38ed038a
--- /dev/null
+++ b/static/openbsd/man9/timeout.9
@@ -0,0 +1,419 @@
+.\" $OpenBSD: timeout.9,v 1.60 2025/05/23 23:56:15 dlg Exp $
+.\"
+.\" Copyright (c) 2000 Artur Grabowski <art@openbsd.org>
+.\" Copyright (c) 2021, 2022 Scott Cheloha <cheloha@openbsd.org>
+.\" All rights reserved.
+.\"
+.\" 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. The name of the author may not be used to endorse or promote products
+.\" derived from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED ``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 AUTHOR 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.
+.\"
+.Dd $Mdocdate: May 23 2025 $
+.Dt TIMEOUT_SET 9
+.Os
+.Sh NAME
+.Nm timeout_set ,
+.Nm timeout_set_flags ,
+.Nm timeout_set_proc ,
+.Nm timeout_add ,
+.Nm timeout_add_sec ,
+.Nm timeout_add_msec ,
+.Nm timeout_add_usec ,
+.Nm timeout_add_nsec ,
+.Nm timeout_abs_ts ,
+.Nm timeout_del ,
+.Nm timeout_del_barrier ,
+.Nm timeout_barrier ,
+.Nm timeout_pending ,
+.Nm timeout_initialized ,
+.Nm timeout_triggered ,
+.Nm TIMEOUT_INITIALIZER ,
+.Nm TIMEOUT_INITIALIZER_FLAGS
+.Nd execute a function in the future
+.Sh SYNOPSIS
+.In sys/types.h
+.In sys/timeout.h
+.Ft void
+.Fo timeout_set
+.Fa "struct timeout *to"
+.Fa "void (*fn)(void *)"
+.Fa "void *arg"
+.Fc
+.Ft void
+.Fo timeout_set_flags
+.Fa "struct timeout *to"
+.Fa "void (*fn)(void *)"
+.Fa "void *arg"
+.Fa "int kclock"
+.Fa "int flags"
+.Fc
+.Ft void
+.Fo timeout_set_proc
+.Fa "struct timeout *to"
+.Fa "void (*fn)(void *)"
+.Fa "void *arg"
+.Fc
+.Ft int
+.Fo timeout_add
+.Fa "struct timeout *to"
+.Fa "int nticks"
+.Fc
+.Ft int
+.Fo timeout_add_sec
+.Fa "struct timeout *to"
+.Fa "int secs"
+.Fc
+.Ft int
+.Fo timeout_add_msec
+.Fa "struct timeout *to"
+.Fa "uint64_t msecs"
+.Fc
+.Ft int
+.Fo timeout_add_usec
+.Fa "struct timeout *to"
+.Fa "uint64_t usecs"
+.Fc
+.Ft int
+.Fo timeout_add_nsec
+.Fa "struct timeout *to"
+.Fa "uint64_t nsecs"
+.Fc
+.Ft int
+.Fo timeout_abs_ts
+.Fa "struct timeout *to"
+.Fa "const struct timespec *abs"
+.Fc
+.Ft int
+.Fo timeout_del
+.Fa "struct timeout *to"
+.Fc
+.Ft int
+.Fo timeout_del_barrier
+.Fa "struct timeout *to"
+.Fc
+.Ft void
+.Fo timeout_barrier
+.Fa "struct timeout *to"
+.Fc
+.Ft int
+.Fo timeout_pending
+.Fa "struct timeout *to"
+.Fc
+.Ft int
+.Fo timeout_initialized
+.Fa "struct timeout *to"
+.Fc
+.Ft int
+.Fo timeout_triggered
+.Fa "struct timeout *to"
+.Fc
+.Fo TIMEOUT_INITIALIZER
+.Fa "void (*fn)(void *)"
+.Fa "void *arg"
+.Fc
+.Fo TIMEOUT_INITIALIZER_FLAGS
+.Fa "void (*fn)(void *)"
+.Fa "void *arg"
+.Fa "int kclock"
+.Fa "int flags"
+.Fc
+.Sh DESCRIPTION
+The
+.Nm timeout
+subsystem schedules functions for asynchronous execution in the future.
+.Pp
+All state is encapsulated in a
+.Vt struct timeout
+allocated by the caller.
+A timeout must be initialized before it may be used as input to other
+functions in the API.
+Once initialized,
+a timeout does not need to be reinitialized unless its function or argument
+must change.
+.Pp
+The
+.Fn timeout_set
+function initializes the timeout
+.Fa to .
+When the timeout is executed,
+the function
+.Fa fn
+will be called with
+.Fa arg
+as its sole parameter.
+The timeout is implicitly scheduled against the
+.Dv KCLOCK_NONE
+clock and is not configured with any additional flags.
+.Pp
+The
+.Fn timeout_set_flags
+function is similar to
+.Fn timeout_set ,
+except that it takes two additional parameters:
+.Bl -tag -width kclock
+.It Fa kclock
+The timeout is scheduled against the given
+.Fa kclock ,
+which must be one of the following:
+.Bl -tag -width KCLOCK_UPTIME
+.It Dv KCLOCK_NONE
+Low resolution tick-based clock.
+The granularity of this clock is limited by the
+.Xr hardclock 9 ,
+which executes roughly
+.Xr hz 9
+times per second.
+.It Dv KCLOCK_UPTIME
+The uptime clock.
+Counts the time elapsed since the system booted.
+.El
+.It Fa flags
+The timeout's behavior may be configured with the bitwise OR of
+zero or more of the following
+.Fa flags :
+.Bl -tag -width TIMEOUT_MPSAFE
+.It Dv TIMEOUT_PROC
+Execute the timeout in a process context instead of the default
+.Dv IPL_SOFTCLOCK
+interrupt context.
+.It Dv TIMEOUT_MPSAFE
+Execute the timeout without the kernel lock.
+Requires the
+.Dv TIMEOUT_PROC
+flag.
+.El
+.El
+.Pp
+The
+.Fn timeout_set_proc
+function is similar to
+.Fn timeout_set ,
+except that the given timeout is configured with the
+.Dv TIMEOUT_PROC
+flag.
+.Pp
+A timeout may also be initialized statically.
+The
+.Fn TIMEOUT_INITIALIZER
+macro is equivalent to the
+.Fn timeout_set
+function and the
+.Fn TIMEOUT_INITIALIZER_FLAGS
+macro is equivalent to the
+.Fn timeout_set_flags
+function.
+.Pp
+The interfaces available for scheduling a timeout vary with the
+.Fa kclock
+set during initialization.
+.Pp
+.Dv KCLOCK_NONE
+timeouts may be scheduled with the function
+.Fn timeout_add ,
+which schedules the given timeout to execute after at least
+.Fa nticks
+.Xr hardclock 9
+ticks have elapsed.
+In practice,
+.Fa nticks
+ticks will usually elapse in slightly less than
+.Pq Fa nticks Cm / Dv hz
+seconds.
+Negative values of
+.Fa nticks
+are illegal.
+If
+.Fa nticks
+is zero it will be silently rounded up to one.
+.Pp
+For convenience,
+.Dv KCLOCK_NONE
+timeouts may also be scheduled with
+.Fn timeout_add_sec ,
+.Fn timeout_add_msec ,
+.Fn timeout_add_usec ,
+or
+.Fn timeout_add_nsec .
+These wrapper functions convert their input durations to a count of
+.Xr hardclock 9
+ticks before calling
+.Fn timeout_add
+to schedule the given timeout.
+.Pp
+Timeouts for any other
+.Fa kclock
+may be scheduled with
+.Fn timeout_abs_ts ,
+which schedules the given timeout to execute at or after the absolute time
+.Fa abs
+has elapsed on the timeout's
+.Fa kclock .
+.Pp
+Once scheduled,
+a timeout is said to be
+.Qq pending .
+A pending timeout may not be reinitialized with
+.Fn timeout_set ,
+.Fn timeout_set_flags ,
+or
+.Fn timeout_set_proc
+until it has been executed or it has been cancelled with
+.Fn timeout_del
+or
+.Fn timeout_del_barrier .
+A pending timeout may be rescheduled without first cancelling it with
+.Fn timeout_del
+or
+.Fn timeout_del_barrier :
+the new expiration time will quietly supersede the original.
+.Pp
+The function
+.Fn timeout_del
+cancels any pending execution of the given timeout.
+.Pp
+The
+.Fn timeout_del_barrier
+function is similar to
+.Fn timeout_del ,
+except that it also blocks until any current execution of the given timeout
+has completed.
+.Pp
+The
+.Fn timeout_barrier
+function blocks until any current execution of the given timeout
+has completed.
+.Pp
+Callers of
+.Fn timeout_barrier
+and
+.Fn timeout_del_barrier
+must not hold locks that can block processing in the timeout's context.
+Otherwise, the system will deadlock.
+.Pp
+The
+.Fn timeout_pending
+macro indicates whether the given timeout is scheduled for execution.
+A timeout's pending status is cleared when it executes or is cancelled.
+.Pp
+The
+.Fn timeout_initialized
+macro indicates whether the given timeout has been initialized with
+.Fn timeout_set
+or
+.Fn timeout_set_flags .
+This macro must not be used unless the memory pointed to by
+.Fa to
+has been zeroed,
+or its return value is meaningless.
+.Pp
+The
+.Fn timeout_triggered
+macro indicates whether the given timeout is executing or has finished
+executing.
+Rescheduling or cancelling a timeout clears its triggered status.
+.Sh CONTEXT
+.Fn timeout_set ,
+.Fn timeout_set_flags ,
+.Fn timeout_set_proc ,
+.Fn timeout_add ,
+.Fn timeout_add_sec ,
+.Fn timeout_add_msec ,
+.Fn timeout_add_usec ,
+.Fn timeout_add_nsec ,
+.Fn timeout_abs_ts ,
+.Fn timeout_del ,
+.Fn timeout_pending ,
+.Fn timeout_initialized ,
+and
+.Fn timeout_triggered
+may be called during autoconf,
+from process context,
+or from any interrupt context.
+.Pp
+.Fn timeout_barrier
+and
+.Fn timeout_del_barrier
+may only be called from process context.
+.Pp
+When a timeout is executed,
+the function
+.Fa fn
+set during initialization is called from the
+.Dv IPL_SOFTCLOCK
+interrupt context,
+or a process context if the timeout was configured with the
+.Dv TIMEOUT_PROC
+flag.
+The function
+.Fa fn
+must not block and must be safe to execute on any CPU in the system.
+.Pp
+Timeouts without the
+.Dv TIMEOUT_MPSAFE
+flag are executed under the kernel lock.
+.Sh RETURN VALUES
+.Fn timeout_add ,
+.Fn timeout_add_sec ,
+.Fn timeout_add_msec ,
+.Fn timeout_add_usec ,
+.Fn timeout_add_nsec ,
+and
+.Fn timeout_abs_ts
+return 1 if the timeout
+.Fa to
+is newly scheduled,
+or zero if the timeout was already pending.
+.Pp
+.Fn timeout_del
+and
+.Fn timeout_del_barrier
+return 1 if the timeout
+.Fa to
+was pending,
+or zero otherwise.
+.Pp
+.Fn timeout_pending ,
+.Fn timeout_initialized ,
+and
+.Fn timeout_triggered
+return non-zero if the corresponding condition is true,
+or zero otherwise.
+.Sh CODE REFERENCES
+.Pa sys/kern/kern_timeout.c
+.Sh SEE ALSO
+.Xr hardclock 9 ,
+.Xr hz 9 ,
+.Xr microtime 9 ,
+.Xr splclock 9 ,
+.Xr task_add 9 ,
+.Xr tsleep 9 ,
+.Xr tvtohz 9
+.Rs
+.%A George Varghese
+.%A Anthony Lauck
+.%B Hashed and hierarchical timing wheels: efficient data structures for \
+implementing a timer facility
+.%O especially Schemes 6 and 7
+.%I IEEE/ACM
+.%J Transactions on Networking
+.%V vol. 5
+.%N no. 6
+.%P pp. 824\(en834
+.%D December 1997
+.Re