Lines Matching refs:efd
92 struct eventfd * const efd = kmem_zalloc(sizeof(*efd), KM_SLEEP); in eventfd_create() local
94 mutex_init(&efd->efd_lock, MUTEX_DEFAULT, IPL_NONE); in eventfd_create()
95 cv_init(&efd->efd_read_wait, "efdread"); in eventfd_create()
96 cv_init(&efd->efd_write_wait, "efdwrite"); in eventfd_create()
97 selinit(&efd->efd_read_sel); in eventfd_create()
98 selinit(&efd->efd_write_sel); in eventfd_create()
99 efd->efd_val = val; in eventfd_create()
100 efd->efd_is_semaphore = !!(flags & EFD_SEMAPHORE); in eventfd_create()
101 getnanotime(&efd->efd_btime); in eventfd_create()
105 return efd; in eventfd_create()
114 eventfd_destroy(struct eventfd * const efd) in eventfd_destroy() argument
117 KASSERT(efd->efd_nwaiters == 0); in eventfd_destroy()
119 cv_destroy(&efd->efd_read_wait); in eventfd_destroy()
120 cv_destroy(&efd->efd_write_wait); in eventfd_destroy()
122 seldestroy(&efd->efd_read_sel); in eventfd_destroy()
123 seldestroy(&efd->efd_write_sel); in eventfd_destroy()
125 mutex_destroy(&efd->efd_lock); in eventfd_destroy()
127 kmem_free(efd, sizeof(*efd)); in eventfd_destroy()
137 eventfd_wait(struct eventfd * const efd, int const fflag, bool const is_write) in eventfd_wait() argument
149 if (efd->efd_restarting) { in eventfd_wait()
154 waitcv = &efd->efd_write_wait; in eventfd_wait()
156 waitcv = &efd->efd_read_wait; in eventfd_wait()
159 efd->efd_nwaiters++; in eventfd_wait()
160 KASSERT(efd->efd_nwaiters > 0); in eventfd_wait()
161 error = cv_wait_sig(waitcv, &efd->efd_lock); in eventfd_wait()
162 efd->efd_nwaiters--; in eventfd_wait()
163 KASSERT(efd->efd_nwaiters >= 0); in eventfd_wait()
169 if (efd->efd_restarting) { in eventfd_wait()
184 eventfd_wake(struct eventfd * const efd, bool const is_write) in eventfd_wake() argument
191 waitcv = &efd->efd_read_wait; in eventfd_wake()
192 sel = &efd->efd_read_sel; in eventfd_wake()
195 waitcv = &efd->efd_write_wait; in eventfd_wake()
196 sel = &efd->efd_write_sel; in eventfd_wake()
211 struct eventfd * const efd = fp->f_eventfd; in eventfd_fop_read() local
220 mutex_enter(&efd->efd_lock); in eventfd_fop_read()
222 while (efd->efd_val == 0) { in eventfd_fop_read()
223 if ((error = eventfd_wait(efd, fflag, false)) != 0) { in eventfd_fop_read()
224 mutex_exit(&efd->efd_lock); in eventfd_fop_read()
229 if (efd->efd_is_semaphore) { in eventfd_fop_read()
231 efd->efd_val--; in eventfd_fop_read()
233 return_value = efd->efd_val; in eventfd_fop_read()
234 efd->efd_val = 0; in eventfd_fop_read()
237 getnanotime(&efd->efd_atime); in eventfd_fop_read()
238 eventfd_wake(efd, false); in eventfd_fop_read()
240 mutex_exit(&efd->efd_lock); in eventfd_fop_read()
251 struct eventfd * const efd = fp->f_eventfd; in eventfd_fop_write() local
269 mutex_enter(&efd->efd_lock); in eventfd_fop_write()
271 KASSERT(efd->efd_val <= EVENTFD_MAXVAL); in eventfd_fop_write()
272 while ((EVENTFD_MAXVAL - efd->efd_val) < write_value) { in eventfd_fop_write()
273 if ((error = eventfd_wait(efd, fflag, true)) != 0) { in eventfd_fop_write()
274 mutex_exit(&efd->efd_lock); in eventfd_fop_write()
279 efd->efd_val += write_value; in eventfd_fop_write()
280 KASSERT(efd->efd_val <= EVENTFD_MAXVAL); in eventfd_fop_write()
282 getnanotime(&efd->efd_mtime); in eventfd_fop_write()
283 eventfd_wake(efd, true); in eventfd_fop_write()
285 mutex_exit(&efd->efd_lock); in eventfd_fop_write()
301 struct eventfd * const efd = fp->f_eventfd; in eventfd_ioctl() local
308 mutex_enter(&efd->efd_lock); in eventfd_ioctl()
309 *(int *)data = efd->efd_val != 0 ? sizeof(eventfd_t) : 0; in eventfd_ioctl()
310 mutex_exit(&efd->efd_lock); in eventfd_ioctl()
334 struct eventfd * const efd = fp->f_eventfd; in eventfd_fop_poll() local
348 mutex_enter(&efd->efd_lock); in eventfd_fop_poll()
351 if (efd->efd_val != 0) { in eventfd_fop_poll()
354 selrecord(curlwp, &efd->efd_read_sel); in eventfd_fop_poll()
359 if (efd->efd_val < EVENTFD_MAXVAL) { in eventfd_fop_poll()
362 selrecord(curlwp, &efd->efd_write_sel); in eventfd_fop_poll()
366 mutex_exit(&efd->efd_lock); in eventfd_fop_poll()
374 struct eventfd * const efd = fp->f_eventfd; in eventfd_fop_stat() local
378 mutex_enter(&efd->efd_lock); in eventfd_fop_stat()
379 st->st_size = (off_t)efd->efd_val; in eventfd_fop_stat()
383 st->st_birthtimespec = st->st_ctimespec = efd->efd_btime; in eventfd_fop_stat()
384 st->st_atimespec = efd->efd_atime; in eventfd_fop_stat()
385 st->st_mtimespec = efd->efd_mtime; in eventfd_fop_stat()
388 mutex_exit(&efd->efd_lock); in eventfd_fop_stat()
396 struct eventfd * const efd = fp->f_eventfd; in eventfd_fop_close() local
399 eventfd_destroy(efd); in eventfd_fop_close()
407 struct eventfd * const efd = ((file_t *)kn->kn_obj)->f_eventfd; in eventfd_filt_read_detach() local
409 mutex_enter(&efd->efd_lock); in eventfd_filt_read_detach()
410 KASSERT(kn->kn_hook == efd); in eventfd_filt_read_detach()
411 selremove_knote(&efd->efd_read_sel, kn); in eventfd_filt_read_detach()
412 mutex_exit(&efd->efd_lock); in eventfd_filt_read_detach()
418 struct eventfd * const efd = ((file_t *)kn->kn_obj)->f_eventfd; in eventfd_filt_read() local
422 KASSERT(mutex_owned(&efd->efd_lock)); in eventfd_filt_read()
424 mutex_enter(&efd->efd_lock); in eventfd_filt_read()
427 kn->kn_data = (int64_t)efd->efd_val; in eventfd_filt_read()
431 mutex_exit(&efd->efd_lock); in eventfd_filt_read()
446 struct eventfd * const efd = ((file_t *)kn->kn_obj)->f_eventfd; in eventfd_filt_write_detach() local
448 mutex_enter(&efd->efd_lock); in eventfd_filt_write_detach()
449 KASSERT(kn->kn_hook == efd); in eventfd_filt_write_detach()
450 selremove_knote(&efd->efd_write_sel, kn); in eventfd_filt_write_detach()
451 mutex_exit(&efd->efd_lock); in eventfd_filt_write_detach()
457 struct eventfd * const efd = ((file_t *)kn->kn_obj)->f_eventfd; in eventfd_filt_write() local
461 KASSERT(mutex_owned(&efd->efd_lock)); in eventfd_filt_write()
463 mutex_enter(&efd->efd_lock); in eventfd_filt_write()
466 kn->kn_data = (int64_t)efd->efd_val; in eventfd_filt_write()
470 mutex_exit(&efd->efd_lock); in eventfd_filt_write()
485 struct eventfd * const efd = ((file_t *)kn->kn_obj)->f_eventfd; in eventfd_fop_kqfilter() local
490 sel = &efd->efd_read_sel; in eventfd_fop_kqfilter()
495 sel = &efd->efd_write_sel; in eventfd_fop_kqfilter()
503 kn->kn_hook = efd; in eventfd_fop_kqfilter()
505 mutex_enter(&efd->efd_lock); in eventfd_fop_kqfilter()
507 mutex_exit(&efd->efd_lock); in eventfd_fop_kqfilter()
515 struct eventfd * const efd = fp->f_eventfd; in eventfd_fop_restart() local
522 mutex_enter(&efd->efd_lock); in eventfd_fop_restart()
524 if (efd->efd_nwaiters != 0) { in eventfd_fop_restart()
525 efd->efd_restarting = true; in eventfd_fop_restart()
526 cv_broadcast(&efd->efd_read_wait); in eventfd_fop_restart()
527 cv_broadcast(&efd->efd_write_wait); in eventfd_fop_restart()
530 mutex_exit(&efd->efd_lock); in eventfd_fop_restart()