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