Lines Matching +full:poll +full:- +full:retry +full:- +full:count
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
41 #include <sys/poll.h>
88 timerfd_t tfd_count; /* (t) expiration count since read */
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()
185 timerfd_t count; in timerfd_read() local
188 if (uio->uio_resid < sizeof(timerfd_t)) in timerfd_read()
191 mtx_lock(&tfd->tfd_lock); in timerfd_read()
192 retry: 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()
205 if ((fp->f_flag & FNONBLOCK) != 0) { in timerfd_read()
206 mtx_unlock(&tfd->tfd_lock); in timerfd_read()
209 td->td_rtcgen = atomic_load_acq_int(&rtc_generation); in timerfd_read()
210 error = mtx_sleep(&tfd->tfd_count, &tfd->tfd_lock, in timerfd_read()
213 goto retry; in timerfd_read()
215 mtx_unlock(&tfd->tfd_lock); in timerfd_read()
220 count = tfd->tfd_count; in timerfd_read()
221 tfd->tfd_count = 0; in timerfd_read()
222 mtx_unlock(&tfd->tfd_lock); in timerfd_read()
223 error = uiomove(&count, sizeof(timerfd_t), uio); in timerfd_read()
235 atomic_set_int(&fp->f_flag, FASYNC); in timerfd_ioctl()
237 atomic_clear_int(&fp->f_flag, FASYNC); in timerfd_ioctl()
241 atomic_set_int(&fp->f_flag, FNONBLOCK); in timerfd_ioctl()
243 atomic_clear_int(&fp->f_flag, FNONBLOCK); in timerfd_ioctl()
253 struct timerfd *tfd = fp->f_data; in timerfd_poll()
256 mtx_lock(&tfd->tfd_lock); in timerfd_poll()
258 tfd->tfd_count > 0 && tfd->tfd_jumped != TFD_READ) in timerfd_poll()
261 selrecord(td, &tfd->tfd_sel); in timerfd_poll()
262 mtx_unlock(&tfd->tfd_lock); in timerfd_poll()
270 struct timerfd *tfd = kn->kn_hook; in filt_timerfddetach()
272 mtx_lock(&tfd->tfd_lock); in filt_timerfddetach()
273 knlist_remove(&tfd->tfd_sel.si_note, kn, 1); in filt_timerfddetach()
274 mtx_unlock(&tfd->tfd_lock); in filt_timerfddetach()
280 struct timerfd *tfd = kn->kn_hook; in filt_timerfdread()
282 mtx_assert(&tfd->tfd_lock, MA_OWNED); in filt_timerfdread()
283 kn->kn_data = (int64_t)tfd->tfd_count; in filt_timerfdread()
284 return (tfd->tfd_count > 0); in filt_timerfdread()
296 struct timerfd *tfd = fp->f_data; in timerfd_kqfilter()
298 if (kn->kn_filter != EVFILT_READ) in timerfd_kqfilter()
301 kn->kn_fop = &timerfd_rfiltops; in timerfd_kqfilter()
302 kn->kn_hook = tfd; in timerfd_kqfilter()
303 knlist_add(&tfd->tfd_sel.si_note, kn, 0); in timerfd_kqfilter()
311 struct timerfd *tfd = fp->f_data; in timerfd_stat()
314 sb->st_nlink = fp->f_count - 1; in timerfd_stat()
315 sb->st_uid = fp->f_cred->cr_uid; in timerfd_stat()
316 sb->st_gid = fp->f_cred->cr_gid; in timerfd_stat()
317 sb->st_blksize = PAGE_SIZE; in timerfd_stat()
318 mtx_lock(&tfd->tfd_lock); in timerfd_stat()
319 sb->st_atim = tfd->tfd_atim; in timerfd_stat()
320 sb->st_mtim = tfd->tfd_mtim; in timerfd_stat()
321 mtx_unlock(&tfd->tfd_lock); in timerfd_stat()
322 sb->st_ctim = sb->st_mtim; in timerfd_stat()
323 sb->st_ino = tfd->tfd_ino; in timerfd_stat()
324 sb->st_birthtim = tfd->tfd_birthtim; in timerfd_stat()
332 struct timerfd *tfd = fp->f_data; in timerfd_close()
338 callout_drain(&tfd->tfd_callout); in timerfd_close()
339 seldrain(&tfd->tfd_sel); in timerfd_close()
340 knlist_destroy(&tfd->tfd_sel.si_note); in timerfd_close()
341 mtx_destroy(&tfd->tfd_lock); in timerfd_close()
343 fp->f_ops = &badfileops; in timerfd_close()
352 struct timerfd *tfd = fp->f_data; in timerfd_fill_kinfo()
354 kif->kf_type = KF_TYPE_TIMERFD; in timerfd_fill_kinfo()
355 kif->kf_un.kf_timerfd.kf_timerfd_clockid = tfd->tfd_clockid; in timerfd_fill_kinfo()
356 kif->kf_un.kf_timerfd.kf_timerfd_flags = tfd->tfd_flags; in timerfd_fill_kinfo()
357 kif->kf_un.kf_timerfd.kf_timerfd_addr = (uintptr_t)tfd; in timerfd_fill_kinfo()
384 mtx_assert(&tfd->tfd_lock, MA_OWNED); in timerfd_curval()
385 *old_value = tfd->tfd_time; in timerfd_curval()
386 if (timespecisset(&tfd->tfd_time.it_value)) { in timerfd_curval()
388 timespecsub(&tfd->tfd_time.it_value, &curr_value, in timerfd_curval()
389 &old_value->it_value); in timerfd_curval()
399 ++tfd->tfd_count; in timerfd_expire()
400 tfd->tfd_expired = true; in timerfd_expire()
401 if (timespecisset(&tfd->tfd_time.it_interval)) { in timerfd_expire()
402 /* Count missed events. */ in timerfd_expire()
404 if (timespeccmp(&uptime, &tfd->tfd_time.it_value, >)) { in timerfd_expire()
405 timespecsub(&uptime, &tfd->tfd_time.it_value, &uptime); in timerfd_expire()
406 tfd->tfd_count += tstosbt(uptime) / in timerfd_expire()
407 tstosbt(tfd->tfd_time.it_interval); in timerfd_expire()
409 timespecadd(&tfd->tfd_time.it_value, in timerfd_expire()
410 &tfd->tfd_time.it_interval, &tfd->tfd_time.it_value); in timerfd_expire()
411 callout_schedule_sbt(&tfd->tfd_callout, in timerfd_expire()
412 tstosbt(tfd->tfd_time.it_value), in timerfd_expire()
416 callout_deactivate(&tfd->tfd_callout); in timerfd_expire()
417 timespecclear(&tfd->tfd_time.it_value); in timerfd_expire()
420 wakeup(&tfd->tfd_count); in timerfd_expire()
421 selwakeup(&tfd->tfd_sel); in timerfd_expire()
422 KNOTE_LOCKED(&tfd->tfd_sel.si_note, 0); in timerfd_expire()
463 tfd->tfd_clockid = (clockid_t)clockid; in kern_timerfd_create()
464 tfd->tfd_flags = flags; in kern_timerfd_create()
465 tfd->tfd_ino = alloc_unr64(&tfdino_unr); in kern_timerfd_create()
466 mtx_init(&tfd->tfd_lock, "timerfd", NULL, MTX_DEF); in kern_timerfd_create()
467 callout_init_mtx(&tfd->tfd_callout, &tfd->tfd_lock, 0); in kern_timerfd_create()
468 knlist_init_mtx(&tfd->tfd_sel.si_note, &tfd->tfd_lock); in kern_timerfd_create()
469 timerfd_getboottime(&tfd->tfd_boottim); in kern_timerfd_create()
470 getnanotime(&tfd->tfd_birthtim); in kern_timerfd_create()
479 td->td_retval[0] = fd; in kern_timerfd_create()
493 if (fp->f_type != DTYPE_TIMERFD) { in kern_timerfd_gettime()
497 tfd = fp->f_data; in kern_timerfd_gettime()
499 mtx_lock(&tfd->tfd_lock); in kern_timerfd_gettime()
501 mtx_unlock(&tfd->tfd_lock); in kern_timerfd_gettime()
518 if (!timespecvalid_interval(&new_value->it_value) || in kern_timerfd_settime()
519 !timespecvalid_interval(&new_value->it_interval)) in kern_timerfd_settime()
525 if (fp->f_type != DTYPE_TIMERFD) { in kern_timerfd_settime()
529 tfd = fp->f_data; in kern_timerfd_settime()
531 mtx_lock(&tfd->tfd_lock); in kern_timerfd_settime()
532 getnanotime(&tfd->tfd_mtim); in kern_timerfd_settime()
533 tfd->tfd_timflags = flags; in kern_timerfd_settime()
540 tfd->tfd_time = *new_value; in kern_timerfd_settime()
541 if (timespecisset(&tfd->tfd_time.it_value)) { in kern_timerfd_settime()
544 timespecadd(&tfd->tfd_time.it_value, &ts, in kern_timerfd_settime()
545 &tfd->tfd_time.it_value); in kern_timerfd_settime()
546 } else if (tfd->tfd_clockid == CLOCK_REALTIME) { in kern_timerfd_settime()
548 if (tfd->tfd_jumped == TFD_CANCELED) in kern_timerfd_settime()
551 timespecsub(&tfd->tfd_time.it_value, &tfd->tfd_boottim, in kern_timerfd_settime()
552 &tfd->tfd_time.it_value); in kern_timerfd_settime()
554 callout_reset_sbt(&tfd->tfd_callout, in kern_timerfd_settime()
555 tstosbt(tfd->tfd_time.it_value), in kern_timerfd_settime()
558 callout_stop(&tfd->tfd_callout); in kern_timerfd_settime()
560 tfd->tfd_count = 0; in kern_timerfd_settime()
561 tfd->tfd_expired = false; in kern_timerfd_settime()
562 tfd->tfd_jumped = TFD_NOJUMP; in kern_timerfd_settime()
563 mtx_unlock(&tfd->tfd_lock); in kern_timerfd_settime()
572 return (kern_timerfd_create(td, uap->clockid, uap->flags)); in sys_timerfd_create()
581 error = kern_timerfd_gettime(td, uap->fd, &curr_value); in sys_timerfd_gettime()
583 error = copyout(&curr_value, uap->curr_value, in sys_timerfd_gettime()
595 error = copyin(uap->new_value, &new_value, sizeof(new_value)); in sys_timerfd_settime()
598 if (uap->old_value == NULL) { in sys_timerfd_settime()
599 error = kern_timerfd_settime(td, uap->fd, uap->flags, in sys_timerfd_settime()
602 error = kern_timerfd_settime(td, uap->fd, uap->flags, in sys_timerfd_settime()
605 error = copyout(&old_value, uap->old_value, in sys_timerfd_settime()