shithub: purgatorio

ref: ec35f468e0eba87c9f09cbbe5fa8af2591e6f914
dir: /man/10/sleep/

View raw version
.TH SLEEP 10.2
.SH NAME
sleep, wakeup, tsleep, return0 \- process synchronisation
.SH SYNOPSIS
.ta \w'\fLvoid 'u
.B
void	sleep(Rendez *r, int (*f)(void*), void *arg)
.PP
.B
void	wakeup(Rendez *r)
.PP
.B
void	tsleep(Rendez *r, int (*f)(void*), void *arg, int ms)
.PP
.B
int	return0(void *arg)
.PP
.SH DESCRIPTION
A process running in the kernel can use these functions to
synchronise with an interrupt handler or another kernel process.
In particular, they are used by device drivers to wait for an event to be signalled on
receipt of an interrupt.
(In practice, they are most often used indirectly, through
.IR qio (10.2)
for instance.)
.PP
The caller of
.I sleep
and a caller of
.I wakeup
share a
.B Rendez
structure, to provide a rendezvous point between them
to synchronise on an event.
.I Sleep
uses a condition function
.I f
that returns true if the event has occurred.
.PP
.I Sleep
evaluates
.IB f ( arg ).
If true, the event has happened and
.I sleep
returns immediately.
Otherwise,
.I sleep
blocks on the event variable
.IR r ,
awaiting
.IR wakeup .
.PP
.I Wakeup
is called by either a process or an interrupt handler to wake any process
sleeping at
.IR r ,
signifying that the corresponding condition is true (the event has occurred).
It has no effect if there is no sleeping process.
.PP
.I Tsleep
is similar to
.IR sleep ,
except that if the condition
.IB f ( arg )
is false and the caller does sleep,
and nothing else wakes it within
.I ms
millliseconds,
the system will wake it.
.IR Tsleep 's
caller must check its environment to decide whether timeout or the event
occurred.
The timing provided by
.I tsleep
is imprecise, but adequate in practice for the normal use of protecting against
lost interrupts and otherwise unresponsive devices or software.
.PP
.I Return0
ignores its arguments and returns zero. It is commonly used as
the predicate
.I f
in a call to
.I tsleep
to obtain a time delay, using a
.B Rendez
variable
.B sleep
in the
.B Proc
structure, for example:
.IP
.B tsleep(&up->sleep, return0, nil, 10);
.PP
Both
.I sleep
and
.I tsleep
can be interrupted by
.IR swiproc
(see
.IR kproc (10.2)),
causing a non-local goto through a call to
.IR error (10.2).
.SH DIAGNOSTICS
There can be at most one process waiting on a
.BR Rendez ,
and if two processes collide, the system will
.IR panic (10.2)
.RB (`` "double sleep" '').
Access to a
.B Rendez
must therefore be serialised by some other mechanism, usually
.IR qlock (10.2).
.SH SOURCE
.B /os/port/proc.c
.br
.B /emu/port/proc.c
.SH SEE ALSO
.IR lock (10.2),
.IR qlock (10.2),
.IR delay (10.2)
.br
``Process Sleep and Wakeup on a Shared-memory Multiprocessor'',
in
.I "Plan 9 Programmer's Manual: Volume 2".