xref: /freebsd/share/man/man9/sleep.9 (revision d6b92ffa)
1.\"
2.\" Copyright (c) 1996 Joerg Wunsch
3.\"
4.\" All rights reserved.
5.\"
6.\" Redistribution and use in source and binary forms, with or without
7.\" modification, are permitted provided that the following conditions
8.\" are met:
9.\" 1. Redistributions of source code must retain the above copyright
10.\"    notice, this list of conditions and the following disclaimer.
11.\" 2. Redistributions in binary form must reproduce the above copyright
12.\"    notice, this list of conditions and the following disclaimer in the
13.\"    documentation and/or other materials provided with the distribution.
14.\"
15.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
16.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
19.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25.\"
26.\" $FreeBSD$
27.\"
28.Dd May 24, 2015
29.Dt SLEEP 9
30.Os
31.Sh NAME
32.Nm msleep ,
33.Nm msleep_sbt ,
34.Nm msleep_spin ,
35.Nm msleep_spin_sbt ,
36.Nm pause ,
37.Nm pause_sbt ,
38.Nm tsleep ,
39.Nm tsleep_sbt ,
40.Nm wakeup
41.Nd wait for events
42.Sh SYNOPSIS
43.In sys/param.h
44.In sys/systm.h
45.In sys/proc.h
46.Ft int
47.Fn msleep "void *chan" "struct mtx *mtx" "int priority" "const char *wmesg" "int timo"
48.Ft int
49.Fn msleep_sbt "void *chan" "struct mtx *mtx" "int priority" \
50"const char *wmesg" "sbintime_t sbt" "sbintime_t pr" "int flags"
51.Ft int
52.Fn msleep_spin "void *chan" "struct mtx *mtx" "const char *wmesg" "int timo"
53.Ft int
54.Fn msleep_spin_sbt "void *chan" "struct mtx *mtx" "const char *wmesg" \
55"sbintime_t sbt" "sbintime_t pr" "int flags"
56.Ft void
57.Fn pause "const char *wmesg" "int timo"
58.Ft void
59.Fn pause_sbt "const char *wmesg" "sbintime_t sbt" "sbintime_t pr" \
60 "int flags"
61.Ft int
62.Fn tsleep "void *chan" "int priority" "const char *wmesg" "int timo"
63.Ft int
64.Fn tsleep_sbt "void *chan" "int priority" "const char *wmesg" \
65"sbintime_t sbt" "sbintime_t pr" "int flags"
66.Ft void
67.Fn wakeup "void *chan"
68.Ft void
69.Fn wakeup_one "void *chan"
70.Sh DESCRIPTION
71The functions
72.Fn tsleep ,
73.Fn msleep ,
74.Fn msleep_spin ,
75.Fn pause ,
76.Fn wakeup ,
77and
78.Fn wakeup_one
79handle event-based thread blocking.
80If a thread must wait for an
81external event, it is put to sleep by
82.Fn tsleep ,
83.Fn msleep ,
84.Fn msleep_spin ,
85or
86.Fn pause .
87Threads may also wait using one of the locking primitive sleep routines
88.Xr mtx_sleep 9 ,
89.Xr rw_sleep 9 ,
90or
91.Xr sx_sleep 9 .
92.Pp
93The parameter
94.Fa chan
95is an arbitrary address that uniquely identifies the event on which
96the thread is being put to sleep.
97All threads sleeping on a single
98.Fa chan
99are woken up later by
100.Fn wakeup ,
101often called from inside an interrupt routine, to indicate that the
102resource the thread was blocking on is available now.
103.Pp
104The parameter
105.Fa priority
106specifies a new priority for the thread as well as some optional flags.
107If the new priority is not 0,
108then the thread will be made
109runnable with the specified
110.Fa priority
111when it resumes.
112.Dv PZERO
113should never be used, as it is for compatibility only.
114A new priority of 0 means to use the thread's current priority when
115it is made runnable again.
116.Pp
117If
118.Fa priority
119includes the
120.Dv PCATCH
121flag, pending signals are allowed to interrupt the sleep, otherwise
122pending signals are ignored during the sleep.
123If
124.Dv PCATCH
125is set and a signal becomes pending,
126.Er ERESTART
127is returned if the current system call should be restarted if
128possible, and
129.Er EINTR
130is returned if the system call should be interrupted by the signal
131(return
132.Er EINTR ) .
133.Pp
134The parameter
135.Fa wmesg
136is a string describing the sleep condition for tools like
137.Xr ps 1 .
138Due to the limited space of those programs to display arbitrary strings,
139this message should not be longer than 6 characters.
140.Pp
141The parameter
142.Fa timo
143specifies a timeout for the sleep.
144If
145.Fa timo
146is not 0,
147then the thread will sleep for at most
148.Fa timo No / Va hz
149seconds.
150If the timeout expires,
151then the sleep function will return
152.Er EWOULDBLOCK .
153.Pp
154.Fn msleep_sbt ,
155.Fn msleep_spin_sbt ,
156.Fn pause_sbt
157and
158.Fn tsleep_sbt
159functions take
160.Fa sbt
161parameter instead of
162.Fa timo .
163It allows the caller to specify relative or absolute wakeup time with higher resolution
164in form of
165.Vt sbintime_t .
166The parameter
167.Fa pr
168allows the caller to specify wanted absolute event precision.
169The parameter
170.Fa flags
171allows the caller to pass additional
172.Fn callout_reset_sbt
173flags.
174.Pp
175Several of the sleep functions including
176.Fn msleep ,
177.Fn msleep_spin ,
178and the locking primitive sleep routines specify an additional lock
179parameter.
180The lock will be released before sleeping and reacquired
181before the sleep routine returns.
182If
183.Fa priority
184includes the
185.Dv PDROP
186flag, then
187the lock will not be reacquired before returning.
188The lock is used to ensure that a condition can be checked atomically,
189and that the current thread can be suspended without missing a
190change to the condition, or an associated wakeup.
191In addition, all of the sleep routines will fully drop the
192.Va Giant
193mutex
194(even if recursed)
195while the thread is suspended and will reacquire the
196.Va Giant
197mutex before the function returns.
198Note that the
199.Va Giant
200mutex may be specified as the lock to drop.
201In that case, however, the
202.Dv PDROP
203flag is not allowed.
204.Pp
205To avoid lost wakeups,
206either a lock should be used to protect against races,
207or a timeout should be specified to place an upper bound on the delay due
208to a lost wakeup.
209As a result,
210the
211.Fn tsleep
212function should only be invoked with a timeout of 0 when the
213.Va Giant
214mutex is held.
215.Pp
216The
217.Fn msleep
218function requires that
219.Fa mtx
220reference a default, i.e. non-spin, mutex.
221Its use is deprecated in favor of
222.Xr mtx_sleep 9
223which provides identical behavior.
224.Pp
225The
226.Fn msleep_spin
227function requires that
228.Fa mtx
229reference a spin mutex.
230The
231.Fn msleep_spin
232function does not accept a
233.Fa priority
234parameter and thus does not support changing the current thread's priority,
235the
236.Dv PDROP
237flag,
238or catching signals via the
239.Dv PCATCH
240flag.
241.Pp
242The
243.Fn pause
244function is a wrapper around
245.Fn tsleep
246that suspends execution of the current thread for the indicated timeout.
247The thread can not be awakened early by signals or calls to
248.Fn wakeup
249or
250.Fn wakeup_one .
251.Pp
252The
253.Fn wakeup_one
254function makes the first thread in the queue that is sleeping on the
255parameter
256.Fa chan
257runnable.
258This reduces the load when a large number of threads are sleeping on
259the same address, but only one of them can actually do any useful work
260when made runnable.
261.Pp
262Due to the way it works, the
263.Fn wakeup_one
264function requires that only related threads sleep on a specific
265.Fa chan
266address.
267It is the programmer's responsibility to choose a unique
268.Fa chan
269value.
270The older
271.Fn wakeup
272function did not require this, though it was never good practice
273for threads to share a
274.Fa chan
275value.
276When converting from
277.Fn wakeup
278to
279.Fn wakeup_one ,
280pay particular attention to ensure that no other threads wait on the
281same
282.Fa chan .
283.Pp
284If the timeout given by
285.Fa timo
286or
287.Fa sbt
288is based on an absolute real-time clock value,
289then the thread should copy the global
290.Va rtc_generation
291into its
292.Va td_rtcgen
293member before reading the RTC.
294If the real-time clock is adjusted, these functions will set
295.Va td_rtcgen
296to zero and return zero.
297The caller should reconsider its orientation with the new RTC value.
298.Sh RETURN VALUES
299When awakened by a call to
300.Fn wakeup
301or
302.Fn wakeup_one ,
303if a signal is pending and
304.Dv PCATCH
305is specified,
306a non-zero error code is returned.
307If the thread is awakened by a call to
308.Fn wakeup
309or
310.Fn wakeup_one ,
311the
312.Fn msleep ,
313.Fn msleep_spin ,
314.Fn tsleep ,
315and locking primitive sleep functions return 0.
316Zero can also be returned when the real-time clock is adjusted;
317see above regarding
318.Va td_rtcgen .
319Otherwise, a non-zero error code is returned.
320.Sh ERRORS
321.Fn msleep ,
322.Fn msleep_spin ,
323.Fn tsleep ,
324and the locking primitive sleep functions will fail if:
325.Bl -tag -width Er
326.It Bq Er EINTR
327The
328.Dv PCATCH
329flag was specified, a signal was caught, and the system call should be
330interrupted.
331.It Bq Er ERESTART
332The
333.Dv PCATCH
334flag was specified, a signal was caught, and the system call should be
335restarted.
336.It Bq Er EWOULDBLOCK
337A non-zero timeout was specified and the timeout expired.
338.El
339.Sh SEE ALSO
340.Xr ps 1 ,
341.Xr locking 9 ,
342.Xr malloc 9 ,
343.Xr mi_switch 9 ,
344.Xr mtx_sleep 9 ,
345.Xr rw_sleep 9 ,
346.Xr sx_sleep 9 ,
347.Xr timeout 9
348.Sh HISTORY
349The functions
350.Fn sleep
351and
352.Fn wakeup
353were present in
354.At v1 .
355They were probably also present in the preceding
356PDP-7 version of
357.Ux .
358They were the basic process synchronization model.
359.Pp
360The
361.Fn tsleep
362function appeared in
363.Bx 4.4
364and added the parameters
365.Fa wmesg
366and
367.Fa timo .
368The
369.Fn sleep
370function was removed in
371.Fx 2.2 .
372The
373.Fn wakeup_one
374function appeared in
375.Fx 2.2 .
376The
377.Fn msleep
378function appeared in
379.Fx 5.0 ,
380and the
381.Fn msleep_spin
382function appeared in
383.Fx 6.2 .
384The
385.Fn pause
386function appeared in
387.Fx 7.0 .
388.Sh AUTHORS
389.An -nosplit
390This manual page was written by
391.An J\(:org Wunsch Aq Mt joerg@FreeBSD.org .
392