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.Sh RETURN VALUES 284When awakened by a call to 285.Fn wakeup 286or 287.Fn wakeup_one , 288if a signal is pending and 289.Dv PCATCH 290is specified, 291a non-zero error code is returned. 292If the thread is awakened by a call to 293.Fn wakeup 294or 295.Fn wakeup_one , 296the 297.Fn msleep , 298.Fn msleep_spin , 299.Fn tsleep , 300and locking primitive sleep functions return 0. 301Otherwise, a non-zero error code is returned. 302.Sh ERRORS 303.Fn msleep , 304.Fn msleep_spin , 305.Fn tsleep , 306and the locking primitive sleep functions will fail if: 307.Bl -tag -width Er 308.It Bq Er EINTR 309The 310.Dv PCATCH 311flag was specified, a signal was caught, and the system call should be 312interrupted. 313.It Bq Er ERESTART 314The 315.Dv PCATCH 316flag was specified, a signal was caught, and the system call should be 317restarted. 318.It Bq Er EWOULDBLOCK 319A non-zero timeout was specified and the timeout expired. 320.El 321.Sh SEE ALSO 322.Xr ps 1 , 323.Xr locking 9 , 324.Xr malloc 9 , 325.Xr mi_switch 9 , 326.Xr mtx_sleep 9 , 327.Xr rw_sleep 9 , 328.Xr sx_sleep 9 , 329.Xr timeout 9 330.Sh HISTORY 331The functions 332.Fn sleep 333and 334.Fn wakeup 335were present in 336.At v1 . 337They were probably also present in the preceding 338PDP-7 version of 339.Ux . 340They were the basic process synchronization model. 341.Pp 342The 343.Fn tsleep 344function appeared in 345.Bx 4.4 346and added the parameters 347.Fa wmesg 348and 349.Fa timo . 350The 351.Fn sleep 352function was removed in 353.Fx 2.2 . 354The 355.Fn wakeup_one 356function appeared in 357.Fx 2.2 . 358The 359.Fn msleep 360function appeared in 361.Fx 5.0 , 362and the 363.Fn msleep_spin 364function appeared in 365.Fx 6.2 . 366The 367.Fn pause 368function appeared in 369.Fx 7.0 . 370.Sh AUTHORS 371.An -nosplit 372This manual page was written by 373.An J\(:org Wunsch Aq Mt joerg@FreeBSD.org . 374