1*6a72db4aSBryan Cantrill.\" 2*6a72db4aSBryan Cantrill.\" This file and its contents are supplied under the terms of the 3*6a72db4aSBryan Cantrill.\" Common Development and Distribution License ("CDDL"), version 1.0. 4*6a72db4aSBryan Cantrill.\" You may only use this file in accordance with the terms of version 5*6a72db4aSBryan Cantrill.\" 1.0 of the CDDL. 6*6a72db4aSBryan Cantrill.\" 7*6a72db4aSBryan Cantrill.\" A full copy of the text of the CDDL should have accompanied this 8*6a72db4aSBryan Cantrill.\" source. A copy of the CDDL is also available via the Internet at 9*6a72db4aSBryan Cantrill.\" http://www.illumos.org/license/CDDL. 10*6a72db4aSBryan Cantrill.\" 11*6a72db4aSBryan Cantrill.\" 12*6a72db4aSBryan Cantrill.\" Copyright (c) 2015, Joyent, Inc. All Rights Reserved. 13*6a72db4aSBryan Cantrill.\" 14*6a72db4aSBryan Cantrill.Dd Feb 23, 2105 15*6a72db4aSBryan Cantrill.Dt TIMERFD 3C 16*6a72db4aSBryan Cantrill.Os 17*6a72db4aSBryan Cantrill.Sh NAME 18*6a72db4aSBryan Cantrill.Nm timerfd_create , 19*6a72db4aSBryan Cantrill.Nm timerfd_settime , 20*6a72db4aSBryan Cantrill.Nm timerfd_gettime 21*6a72db4aSBryan Cantrill.Nd create and manipulate timers via a file descriptor interface 22*6a72db4aSBryan Cantrill.Sh SYNOPSIS 23*6a72db4aSBryan Cantrill.In sys/timerfd.h 24*6a72db4aSBryan Cantrill.Ft int 25*6a72db4aSBryan Cantrill.Fo timerfd_create 26*6a72db4aSBryan Cantrill.Fa "int clockid" 27*6a72db4aSBryan Cantrill.Fa "int flags" 28*6a72db4aSBryan Cantrill.Fc 29*6a72db4aSBryan Cantrill.Ft int 30*6a72db4aSBryan Cantrill.Fo timerfd_settime 31*6a72db4aSBryan Cantrill.Fa "int fd" 32*6a72db4aSBryan Cantrill.Fa "int flags" 33*6a72db4aSBryan Cantrill.Fa "const struct itimerspec *restrict value" 34*6a72db4aSBryan Cantrill.Fa "struct itimterspec *restrict ovalue" 35*6a72db4aSBryan Cantrill.Fc 36*6a72db4aSBryan Cantrill.Ft int 37*6a72db4aSBryan Cantrill.Fo timerfd_gettime 38*6a72db4aSBryan Cantrill.Fa "int fd" 39*6a72db4aSBryan Cantrill.Fa "struct itimerspec *value" 40*6a72db4aSBryan Cantrill.Fc 41*6a72db4aSBryan Cantrill.Sh DESCRIPTION 42*6a72db4aSBryan CantrillThese routines create and manipulate timers in which events are associated 43*6a72db4aSBryan Cantrillwith a file descriptor, allowing for timer-based events to be used 44*6a72db4aSBryan Cantrillin file-descriptor based facilities like 45*6a72db4aSBryan Cantrill.Xr poll 2 , 46*6a72db4aSBryan Cantrill.Xr port_get 3C 47*6a72db4aSBryan Cantrillor 48*6a72db4aSBryan Cantrill.Xr epoll_wait 3C . 49*6a72db4aSBryan CantrillThe 50*6a72db4aSBryan Cantrill.Fn timerfd_create 51*6a72db4aSBryan Cantrillfunction creates a timer with the clock 52*6a72db4aSBryan Cantrilltype specified by 53*6a72db4aSBryan Cantrill.Fa clockid . 54*6a72db4aSBryan CantrillThe 55*6a72db4aSBryan Cantrill.Sy CLOCK_REALTIME 56*6a72db4aSBryan Cantrilland 57*6a72db4aSBryan Cantrill.Sy CLOCK_HIGHRES 58*6a72db4aSBryan Cantrillclock types, as defined in 59*6a72db4aSBryan Cantrill.Xr timer_create 3C , 60*6a72db4aSBryan Cantrillare supported by 61*6a72db4aSBryan Cantrill.Fn timerfd_create . 62*6a72db4aSBryan Cantrill(Note that 63*6a72db4aSBryan Cantrill.Sy CLOCK_MONOTONIC 64*6a72db4aSBryan Cantrillmay be used as an alias for 65*6a72db4aSBryan Cantrill.Sy CLOCK_HIGHRES Ns .) 66*6a72db4aSBryan Cantrill.Pp 67*6a72db4aSBryan CantrillThe 68*6a72db4aSBryan Cantrill.Fa flags 69*6a72db4aSBryan Cantrillargument specifies additional parameters for the timer instance, and can have 70*6a72db4aSBryan Cantrillany of the following values: 71*6a72db4aSBryan Cantrill.Bl -hang -width Ds 72*6a72db4aSBryan Cantrill.It Sy TFD_CLOEXEC 73*6a72db4aSBryan Cantrill.Bd -filled -compact 74*6a72db4aSBryan CantrillInstance will be closed upon an 75*6a72db4aSBryan Cantrill.Xr exec 2 ; 76*6a72db4aSBryan Cantrillsee 77*6a72db4aSBryan Cantrill.Xr open 2 Ns 's 78*6a72db4aSBryan Cantrilldescription of 79*6a72db4aSBryan Cantrill.Sy O_CLOEXEC . 80*6a72db4aSBryan Cantrill.Ed 81*6a72db4aSBryan Cantrill.It Sy TFD_NONBLOCK 82*6a72db4aSBryan Cantrill.Bd -filled -compact 83*6a72db4aSBryan CantrillInstance will be set to be non-blocking. A 84*6a72db4aSBryan Cantrill.Xr read 2 85*6a72db4aSBryan Cantrillon a 86*6a72db4aSBryan Cantrill.Sy timerfd 87*6a72db4aSBryan Cantrillinstance that has been initialized with 88*6a72db4aSBryan Cantrill.Sy TFD_NONBLOCK 89*6a72db4aSBryan Cantrillwill return 90*6a72db4aSBryan Cantrill.Sy EAGAIN 91*6a72db4aSBryan Cantrillin lieu of blocking if the 92*6a72db4aSBryan Cantrilltimer has not expired since the last 93*6a72db4aSBryan Cantrill.Fn timerfd_settime 94*6a72db4aSBryan Cantrillor successful 95*6a72db4aSBryan Cantrill.Fn read . 96*6a72db4aSBryan Cantrill.Ed 97*6a72db4aSBryan Cantrill.El 98*6a72db4aSBryan Cantrill.Pp 99*6a72db4aSBryan CantrillThe following operations can be performed upon a 100*6a72db4aSBryan Cantrill.Sy timerfd 101*6a72db4aSBryan Cantrillinstance: 102*6a72db4aSBryan Cantrill.Bl -hang -width Ds 103*6a72db4aSBryan Cantrill.It Sy read(2) 104*6a72db4aSBryan Cantrill.Bd -filled -compact 105*6a72db4aSBryan CantrillAtomically reads and clears the number of timer expirations since the 106*6a72db4aSBryan Cantrilllast successful 107*6a72db4aSBryan Cantrill.Xr read 2 108*6a72db4aSBryan Cantrillor 109*6a72db4aSBryan Cantrill.Fn timerfd_settime . 110*6a72db4aSBryan CantrillUpon success, 111*6a72db4aSBryan Cantrillthe number of expirations will be copied into the eight byte buffer 112*6a72db4aSBryan Cantrillpassed to the system call. If there have been no expirations of the 113*6a72db4aSBryan Cantrilltimer since the last successful 114*6a72db4aSBryan Cantrill.Xr read 2 115*6a72db4aSBryan Cantrillor 116*6a72db4aSBryan Cantrill.Fn timerfd_sttime , 117*6a72db4aSBryan Cantrill.Xr read 2 118*6a72db4aSBryan Cantrillwill block until at least the next expiration, 119*6a72db4aSBryan Cantrillor return 120*6a72db4aSBryan Cantrill.Sy EAGAIN 121*6a72db4aSBryan Cantrillif the instance was created with 122*6a72db4aSBryan Cantrill.Sy TFD_NONBLOCK . 123*6a72db4aSBryan CantrillNote that if multiple threads are blocked in 124*6a72db4aSBryan Cantrill.Xr read 2 125*6a72db4aSBryan Cantrillfor the same timer, only one of them will return upon 126*6a72db4aSBryan Cantrilla single timer expiration. 127*6a72db4aSBryan Cantrill.Pp 128*6a72db4aSBryan CantrillIf the buffer specified to 129*6a72db4aSBryan Cantrill.Xr read 2 130*6a72db4aSBryan Cantrillis less than 131*6a72db4aSBryan Cantrilleight bytes in length, 132*6a72db4aSBryan Cantrill.Sy EINAVL 133*6a72db4aSBryan Cantrillwill be returned. 134*6a72db4aSBryan Cantrill.Ed 135*6a72db4aSBryan Cantrill.It Sy poll(2), port_get(3C), epoll_wait(3C) 136*6a72db4aSBryan Cantrill.Bd -filled -compact 137*6a72db4aSBryan CantrillProvide notification when the timer expires or has expired in the past without 138*6a72db4aSBryan Cantrilla more recent 139*6a72db4aSBryan Cantrill.Xr read 2 . 140*6a72db4aSBryan CantrillNote that threads being simultaneously 141*6a72db4aSBryan Cantrillblocked in 142*6a72db4aSBryan Cantrill.Xr read 2 143*6a72db4aSBryan Cantrilland 144*6a72db4aSBryan Cantrill.Xr poll 2 145*6a72db4aSBryan Cantrill(or equivalents) for the same 146*6a72db4aSBryan Cantrilltimer constitute an application-level race; on a timer expiration, 147*6a72db4aSBryan Cantrillthe thread blocked in 148*6a72db4aSBryan Cantrill.Xr poll 2 149*6a72db4aSBryan Cantrillmay or may not return depending on how 150*6a72db4aSBryan Cantrillit is scheduled with respect to the thread blocked in 151*6a72db4aSBryan Cantrill.Xr read 2 . 152*6a72db4aSBryan Cantrill.Ed 153*6a72db4aSBryan Cantrill.It Sy timerfd_gettime() 154*6a72db4aSBryan Cantrill.Bd -filled -compact 155*6a72db4aSBryan CantrillReturns the amount of time until the next timer expiration, with the 156*6a72db4aSBryan Cantrillsame functional signature and semantics as 157*6a72db4aSBryan Cantrill.Xr timer_gettime 3C . 158*6a72db4aSBryan Cantrill.Ed 159*6a72db4aSBryan Cantrill.It Sy timerfd_settime() 160*6a72db4aSBryan Cantrill.Bd -filled -compact 161*6a72db4aSBryan CantrillSets or disarms the timer, with the 162*6a72db4aSBryan Cantrillsame functional signature and semantics as 163*6a72db4aSBryan Cantrill.Xr timer_settime 3C . 164*6a72db4aSBryan Cantrill.Ed 165*6a72db4aSBryan Cantrill.El 166*6a72db4aSBryan Cantrill.Sh RETURN VALUES 167*6a72db4aSBryan CantrillUpon succesful completion, a file descriptor associated with the instance 168*6a72db4aSBryan Cantrillis returned. Otherwise, 169*6a72db4aSBryan Cantrill.Sy -1 170*6a72db4aSBryan Cantrillis returned and errno is set to indicate the error. 171*6a72db4aSBryan Cantrill.Sh ERRORS 172*6a72db4aSBryan CantrillThe 173*6a72db4aSBryan Cantrill.Fn timerfd_create() 174*6a72db4aSBryan Cantrillfunction will fail if: 175*6a72db4aSBryan Cantrill.Bl -tag -width Er 176*6a72db4aSBryan Cantrill.It Er EINAL 177*6a72db4aSBryan CantrillThe 178*6a72db4aSBryan Cantrill.Fa flags 179*6a72db4aSBryan Cantrillare invalid. 180*6a72db4aSBryan Cantrill.It Er EMFILE 181*6a72db4aSBryan CantrillThere are currently 182*6a72db4aSBryan Cantrill.Pf { Sy OPEN_MAX Ns } 183*6a72db4aSBryan Cantrillfile descriptors open in the calling process. 184*6a72db4aSBryan Cantrill.It Er EPERM 185*6a72db4aSBryan CantrillThe 186*6a72db4aSBryan Cantrill.Fa clock_id , 187*6a72db4aSBryan Cantrillis 188*6a72db4aSBryan Cantrill.Sy CLOCK_HIGHRES 189*6a72db4aSBryan Cantrilland the 190*6a72db4aSBryan Cantrill.Pf { Sy PRIV_PROC_CLOCK_HIGHRES Ns } 191*6a72db4aSBryan Cantrillis not asserted in the effective set of the calling process. 192*6a72db4aSBryan Cantrill.El 193*6a72db4aSBryan Cantrill.Sh SEE ALSO 194*6a72db4aSBryan Cantrill.Xr poll 2 , 195*6a72db4aSBryan Cantrill.Xr port_get 3C , 196*6a72db4aSBryan Cantrill.Xr epoll_wait 3C , 197*6a72db4aSBryan Cantrill.Xr timer_create 3C , 198*6a72db4aSBryan Cantrill.Xr timer_gettime 3C , 199*6a72db4aSBryan Cantrill.Xr timer_settime 3C , 200*6a72db4aSBryan Cantrill.Xr privileages 5 , 201*6a72db4aSBryan Cantrill.Xr timerfd 5 202