Lines Matching refs:tfd
134 struct timerfd *tfd; in timerfd_jumped() local
142 LIST_FOREACH(tfd, &timerfd_list, entry) { in timerfd_jumped()
143 mtx_lock(&tfd->tfd_lock); in timerfd_jumped()
144 if (tfd->tfd_clockid != CLOCK_REALTIME || in timerfd_jumped()
145 (tfd->tfd_timflags & TFD_TIMER_ABSTIME) == 0 || in timerfd_jumped()
146 timespeccmp(&boottime, &tfd->tfd_boottim, ==)) { in timerfd_jumped()
147 mtx_unlock(&tfd->tfd_lock); in timerfd_jumped()
151 if (callout_active(&tfd->tfd_callout)) { in timerfd_jumped()
152 if ((tfd->tfd_timflags & TFD_TIMER_CANCEL_ON_SET) != 0) in timerfd_jumped()
153 tfd->tfd_jumped = TFD_CANCELED; in timerfd_jumped()
154 else if (timespeccmp(&boottime, &tfd->tfd_boottim, <)) in timerfd_jumped()
155 tfd->tfd_jumped = TFD_ZREAD; in timerfd_jumped()
161 if (!tfd->tfd_expired) { in timerfd_jumped()
163 &tfd->tfd_boottim, &diff); in timerfd_jumped()
164 timespecsub(&tfd->tfd_time.it_value, in timerfd_jumped()
165 &diff, &tfd->tfd_time.it_value); in timerfd_jumped()
166 if (callout_stop(&tfd->tfd_callout) == 1) { in timerfd_jumped()
167 callout_schedule_sbt(&tfd->tfd_callout, in timerfd_jumped()
168 tstosbt(tfd->tfd_time.it_value), in timerfd_jumped()
174 tfd->tfd_boottim = boottime; in timerfd_jumped()
175 mtx_unlock(&tfd->tfd_lock); in timerfd_jumped()
184 struct timerfd *tfd = fp->f_data; in timerfd_read() local
191 mtx_lock(&tfd->tfd_lock); in timerfd_read()
193 getnanotime(&tfd->tfd_atim); in timerfd_read()
194 if ((tfd->tfd_jumped & TFD_JUMPED) != 0) { in timerfd_read()
195 if (tfd->tfd_jumped == TFD_CANCELED) in timerfd_read()
197 tfd->tfd_jumped = TFD_READ; in timerfd_read()
198 tfd->tfd_count = 0; in timerfd_read()
199 mtx_unlock(&tfd->tfd_lock); in timerfd_read()
202 tfd->tfd_jumped = TFD_NOJUMP; in timerfd_read()
204 if (tfd->tfd_count == 0) { in timerfd_read()
206 mtx_unlock(&tfd->tfd_lock); in timerfd_read()
209 error = mtx_sleep(&tfd->tfd_count, &tfd->tfd_lock, in timerfd_read()
214 mtx_unlock(&tfd->tfd_lock); in timerfd_read()
219 count = tfd->tfd_count; in timerfd_read()
220 tfd->tfd_count = 0; in timerfd_read()
221 mtx_unlock(&tfd->tfd_lock); in timerfd_read()
252 struct timerfd *tfd = fp->f_data; in timerfd_poll() local
255 mtx_lock(&tfd->tfd_lock); in timerfd_poll()
257 tfd->tfd_count > 0 && tfd->tfd_jumped != TFD_READ) in timerfd_poll()
260 selrecord(td, &tfd->tfd_sel); in timerfd_poll()
261 mtx_unlock(&tfd->tfd_lock); in timerfd_poll()
269 struct timerfd *tfd = kn->kn_hook; in filt_timerfddetach() local
271 mtx_lock(&tfd->tfd_lock); in filt_timerfddetach()
272 knlist_remove(&tfd->tfd_sel.si_note, kn, 1); in filt_timerfddetach()
273 mtx_unlock(&tfd->tfd_lock); in filt_timerfddetach()
279 struct timerfd *tfd = kn->kn_hook; in filt_timerfdread() local
281 mtx_assert(&tfd->tfd_lock, MA_OWNED); in filt_timerfdread()
282 kn->kn_data = (int64_t)tfd->tfd_count; in filt_timerfdread()
283 return (tfd->tfd_count > 0); in filt_timerfdread()
295 struct timerfd *tfd = fp->f_data; in timerfd_kqfilter() local
301 kn->kn_hook = tfd; in timerfd_kqfilter()
302 knlist_add(&tfd->tfd_sel.si_note, kn, 0); in timerfd_kqfilter()
310 struct timerfd *tfd = fp->f_data; in timerfd_stat() local
317 mtx_lock(&tfd->tfd_lock); in timerfd_stat()
318 sb->st_atim = tfd->tfd_atim; in timerfd_stat()
319 sb->st_mtim = tfd->tfd_mtim; in timerfd_stat()
320 mtx_unlock(&tfd->tfd_lock); in timerfd_stat()
322 sb->st_ino = tfd->tfd_ino; in timerfd_stat()
323 sb->st_birthtim = tfd->tfd_birthtim; in timerfd_stat()
331 struct timerfd *tfd = fp->f_data; in timerfd_close() local
334 LIST_REMOVE(tfd, entry); in timerfd_close()
337 callout_drain(&tfd->tfd_callout); in timerfd_close()
338 seldrain(&tfd->tfd_sel); in timerfd_close()
339 knlist_destroy(&tfd->tfd_sel.si_note); in timerfd_close()
340 mtx_destroy(&tfd->tfd_lock); in timerfd_close()
341 free(tfd, M_TIMERFD); in timerfd_close()
351 struct timerfd *tfd = fp->f_data; in timerfd_fill_kinfo() local
354 kif->kf_un.kf_timerfd.kf_timerfd_clockid = tfd->tfd_clockid; in timerfd_fill_kinfo()
355 kif->kf_un.kf_timerfd.kf_timerfd_flags = tfd->tfd_flags; in timerfd_fill_kinfo()
356 kif->kf_un.kf_timerfd.kf_timerfd_addr = (uintptr_t)tfd; in timerfd_fill_kinfo()
379 timerfd_curval(struct timerfd *tfd, struct itimerspec *old_value) in timerfd_curval() argument
383 mtx_assert(&tfd->tfd_lock, MA_OWNED); in timerfd_curval()
384 *old_value = tfd->tfd_time; in timerfd_curval()
385 if (timespecisset(&tfd->tfd_time.it_value)) { in timerfd_curval()
387 timespecsub(&tfd->tfd_time.it_value, &curr_value, in timerfd_curval()
395 struct timerfd *tfd = (struct timerfd *)arg; in timerfd_expire() local
398 ++tfd->tfd_count; in timerfd_expire()
399 tfd->tfd_expired = true; in timerfd_expire()
400 if (timespecisset(&tfd->tfd_time.it_interval)) { in timerfd_expire()
403 if (timespeccmp(&uptime, &tfd->tfd_time.it_value, >)) { in timerfd_expire()
404 timespecsub(&uptime, &tfd->tfd_time.it_value, &uptime); in timerfd_expire()
405 tfd->tfd_count += tstosbt(uptime) / in timerfd_expire()
406 tstosbt(tfd->tfd_time.it_interval); in timerfd_expire()
408 timespecadd(&tfd->tfd_time.it_value, in timerfd_expire()
409 &tfd->tfd_time.it_interval, &tfd->tfd_time.it_value); in timerfd_expire()
410 callout_schedule_sbt(&tfd->tfd_callout, in timerfd_expire()
411 tstosbt(tfd->tfd_time.it_value), in timerfd_expire()
415 callout_deactivate(&tfd->tfd_callout); in timerfd_expire()
416 timespecclear(&tfd->tfd_time.it_value); in timerfd_expire()
419 wakeup(&tfd->tfd_count); in timerfd_expire()
420 selwakeup(&tfd->tfd_sel); in timerfd_expire()
421 KNOTE_LOCKED(&tfd->tfd_sel.si_note, 0); in timerfd_expire()
428 struct timerfd *tfd; in kern_timerfd_create() local
461 tfd = malloc(sizeof(*tfd), M_TIMERFD, M_WAITOK | M_ZERO); in kern_timerfd_create()
462 tfd->tfd_clockid = (clockid_t)clockid; in kern_timerfd_create()
463 tfd->tfd_flags = flags; in kern_timerfd_create()
464 tfd->tfd_ino = alloc_unr64(&tfdino_unr); in kern_timerfd_create()
465 mtx_init(&tfd->tfd_lock, "timerfd", NULL, MTX_DEF); in kern_timerfd_create()
466 callout_init_mtx(&tfd->tfd_callout, &tfd->tfd_lock, 0); in kern_timerfd_create()
467 knlist_init_mtx(&tfd->tfd_sel.si_note, &tfd->tfd_lock); in kern_timerfd_create()
468 timerfd_getboottime(&tfd->tfd_boottim); in kern_timerfd_create()
469 getnanotime(&tfd->tfd_birthtim); in kern_timerfd_create()
471 LIST_INSERT_HEAD(&timerfd_list, tfd, entry); in kern_timerfd_create()
474 finit(fp, fflags, DTYPE_TIMERFD, tfd, &timerfdops); in kern_timerfd_create()
486 struct timerfd *tfd; in kern_timerfd_gettime() local
496 tfd = fp->f_data; in kern_timerfd_gettime()
498 mtx_lock(&tfd->tfd_lock); in kern_timerfd_gettime()
499 timerfd_curval(tfd, curr_value); in kern_timerfd_gettime()
500 mtx_unlock(&tfd->tfd_lock); in kern_timerfd_gettime()
511 struct timerfd *tfd; in kern_timerfd_settime() local
528 tfd = fp->f_data; in kern_timerfd_settime()
530 mtx_lock(&tfd->tfd_lock); in kern_timerfd_settime()
531 getnanotime(&tfd->tfd_mtim); in kern_timerfd_settime()
532 tfd->tfd_timflags = flags; in kern_timerfd_settime()
536 timerfd_curval(tfd, old_value); in kern_timerfd_settime()
539 tfd->tfd_time = *new_value; in kern_timerfd_settime()
540 if (timespecisset(&tfd->tfd_time.it_value)) { in kern_timerfd_settime()
543 timespecadd(&tfd->tfd_time.it_value, &ts, in kern_timerfd_settime()
544 &tfd->tfd_time.it_value); in kern_timerfd_settime()
545 } else if (tfd->tfd_clockid == CLOCK_REALTIME) { in kern_timerfd_settime()
547 if (tfd->tfd_jumped == TFD_CANCELED) in kern_timerfd_settime()
550 timespecsub(&tfd->tfd_time.it_value, &tfd->tfd_boottim, in kern_timerfd_settime()
551 &tfd->tfd_time.it_value); in kern_timerfd_settime()
553 callout_reset_sbt(&tfd->tfd_callout, in kern_timerfd_settime()
554 tstosbt(tfd->tfd_time.it_value), in kern_timerfd_settime()
555 0, timerfd_expire, tfd, C_ABSOLUTE); in kern_timerfd_settime()
557 callout_stop(&tfd->tfd_callout); in kern_timerfd_settime()
559 tfd->tfd_count = 0; in kern_timerfd_settime()
560 tfd->tfd_expired = false; in kern_timerfd_settime()
561 tfd->tfd_jumped = TFD_NOJUMP; in kern_timerfd_settime()
562 mtx_unlock(&tfd->tfd_lock); in kern_timerfd_settime()