Lines Matching refs:efd
111 struct eventfd *efd; in eventfd_create_file() local
117 efd = malloc(sizeof(*efd), M_EVENTFD, M_WAITOK | M_ZERO); in eventfd_create_file()
118 efd->efd_flags = flags; in eventfd_create_file()
119 efd->efd_count = initval; in eventfd_create_file()
120 mtx_init(&efd->efd_lock, "eventfd", NULL, MTX_DEF); in eventfd_create_file()
121 knlist_init_mtx(&efd->efd_sel.si_note, &efd->efd_lock); in eventfd_create_file()
126 finit(fp, fflags, DTYPE_EVENTFD, efd, &eventfdops); in eventfd_create_file()
134 struct eventfd *efd; in eventfd_close() local
136 efd = fp->f_data; in eventfd_close()
137 seldrain(&efd->efd_sel); in eventfd_close()
138 knlist_destroy(&efd->efd_sel.si_note); in eventfd_close()
139 mtx_destroy(&efd->efd_lock); in eventfd_close()
140 free(efd, M_EVENTFD); in eventfd_close()
148 struct eventfd *efd; in eventfd_read() local
156 efd = fp->f_data; in eventfd_read()
157 mtx_lock(&efd->efd_lock); in eventfd_read()
158 while (error == 0 && efd->efd_count == 0) { in eventfd_read()
160 mtx_unlock(&efd->efd_lock); in eventfd_read()
163 error = mtx_sleep(&efd->efd_count, &efd->efd_lock, PCATCH, in eventfd_read()
167 MPASS(efd->efd_count > 0); in eventfd_read()
168 if ((efd->efd_flags & EFD_SEMAPHORE) != 0) { in eventfd_read()
170 --efd->efd_count; in eventfd_read()
172 count = efd->efd_count; in eventfd_read()
173 efd->efd_count = 0; in eventfd_read()
175 KNOTE_LOCKED(&efd->efd_sel.si_note, 0); in eventfd_read()
176 selwakeup(&efd->efd_sel); in eventfd_read()
177 wakeup(&efd->efd_count); in eventfd_read()
178 mtx_unlock(&efd->efd_lock); in eventfd_read()
181 mtx_unlock(&efd->efd_lock); in eventfd_read()
190 struct eventfd *efd; in eventfd_write() local
203 efd = fp->f_data; in eventfd_write()
204 mtx_lock(&efd->efd_lock); in eventfd_write()
206 if (UINT64_MAX - efd->efd_count <= count) { in eventfd_write()
208 mtx_unlock(&efd->efd_lock); in eventfd_write()
213 error = mtx_sleep(&efd->efd_count, &efd->efd_lock, in eventfd_write()
219 MPASS(UINT64_MAX - efd->efd_count > count); in eventfd_write()
220 efd->efd_count += count; in eventfd_write()
221 KNOTE_LOCKED(&efd->efd_sel.si_note, 0); in eventfd_write()
222 selwakeup(&efd->efd_sel); in eventfd_write()
223 wakeup(&efd->efd_count); in eventfd_write()
225 mtx_unlock(&efd->efd_lock); in eventfd_write()
234 struct eventfd *efd; in eventfd_poll() local
237 efd = fp->f_data; in eventfd_poll()
239 mtx_lock(&efd->efd_lock); in eventfd_poll()
240 if ((events & (POLLIN | POLLRDNORM)) != 0 && efd->efd_count > 0) in eventfd_poll()
243 efd->efd_count) in eventfd_poll()
246 selrecord(td, &efd->efd_sel); in eventfd_poll()
247 mtx_unlock(&efd->efd_lock); in eventfd_poll()
255 struct eventfd *efd = fp->f_data; in eventfd_kqfilter() local
257 mtx_lock(&efd->efd_lock); in eventfd_kqfilter()
266 mtx_unlock(&efd->efd_lock); in eventfd_kqfilter()
270 kn->kn_hook = efd; in eventfd_kqfilter()
271 knlist_add(&efd->efd_sel.si_note, kn, 1); in eventfd_kqfilter()
272 mtx_unlock(&efd->efd_lock); in eventfd_kqfilter()
280 struct eventfd *efd = kn->kn_hook; in filt_eventfddetach() local
282 mtx_lock(&efd->efd_lock); in filt_eventfddetach()
283 knlist_remove(&efd->efd_sel.si_note, kn, 1); in filt_eventfddetach()
284 mtx_unlock(&efd->efd_lock); in filt_eventfddetach()
290 struct eventfd *efd = kn->kn_hook; in filt_eventfdread() local
293 mtx_assert(&efd->efd_lock, MA_OWNED); in filt_eventfdread()
294 kn->kn_data = (int64_t)efd->efd_count; in filt_eventfdread()
295 ret = efd->efd_count > 0; in filt_eventfdread()
303 struct eventfd *efd = kn->kn_hook; in filt_eventfdwrite() local
306 mtx_assert(&efd->efd_lock, MA_OWNED); in filt_eventfdwrite()
307 kn->kn_data = (int64_t)(UINT64_MAX - 1 - efd->efd_count); in filt_eventfdwrite()
308 ret = UINT64_MAX - 1 > efd->efd_count; in filt_eventfdwrite()
337 struct eventfd *efd = fp->f_data; in eventfd_fill_kinfo() local
340 mtx_lock(&efd->efd_lock); in eventfd_fill_kinfo()
341 kif->kf_un.kf_eventfd.kf_eventfd_value = efd->efd_count; in eventfd_fill_kinfo()
342 kif->kf_un.kf_eventfd.kf_eventfd_flags = efd->efd_flags; in eventfd_fill_kinfo()
343 kif->kf_un.kf_eventfd.kf_eventfd_addr = (uintptr_t)efd; in eventfd_fill_kinfo()
344 mtx_unlock(&efd->efd_lock); in eventfd_fill_kinfo()