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