Lines Matching +full:poll +full:- +full:retry +full:- +full:count
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
41 #include <sys/poll.h>
115 efd->efd_flags = flags; in eventfd_create_file()
116 efd->efd_count = initval; in eventfd_create_file()
117 mtx_init(&efd->efd_lock, "eventfd", NULL, MTX_DEF); in eventfd_create_file()
118 knlist_init_mtx(&efd->efd_sel.si_note, &efd->efd_lock); in eventfd_create_file()
133 efd = fp->f_data; in eventfd_close()
134 seldrain(&efd->efd_sel); in eventfd_close()
135 knlist_destroy(&efd->efd_sel.si_note); in eventfd_close()
136 mtx_destroy(&efd->efd_lock); in eventfd_close()
146 eventfd_t count; in eventfd_read() local
149 if (uio->uio_resid < sizeof(eventfd_t)) in eventfd_read()
153 efd = fp->f_data; in eventfd_read()
154 mtx_lock(&efd->efd_lock); in eventfd_read()
155 while (error == 0 && efd->efd_count == 0) { in eventfd_read()
156 if ((fp->f_flag & FNONBLOCK) != 0) { in eventfd_read()
157 mtx_unlock(&efd->efd_lock); in eventfd_read()
160 error = mtx_sleep(&efd->efd_count, &efd->efd_lock, PCATCH, in eventfd_read()
164 MPASS(efd->efd_count > 0); in eventfd_read()
165 if ((efd->efd_flags & EFD_SEMAPHORE) != 0) { in eventfd_read()
166 count = 1; in eventfd_read()
167 --efd->efd_count; in eventfd_read()
169 count = efd->efd_count; in eventfd_read()
170 efd->efd_count = 0; in eventfd_read()
172 KNOTE_LOCKED(&efd->efd_sel.si_note, 0); in eventfd_read()
173 selwakeup(&efd->efd_sel); in eventfd_read()
174 wakeup(&efd->efd_count); in eventfd_read()
175 mtx_unlock(&efd->efd_lock); in eventfd_read()
176 error = uiomove(&count, sizeof(eventfd_t), uio); in eventfd_read()
178 mtx_unlock(&efd->efd_lock); in eventfd_read()
188 eventfd_t count; in eventfd_write() local
191 if (uio->uio_resid < sizeof(eventfd_t)) in eventfd_write()
194 error = uiomove(&count, sizeof(eventfd_t), uio); in eventfd_write()
197 if (count == UINT64_MAX) in eventfd_write()
200 efd = fp->f_data; in eventfd_write()
201 mtx_lock(&efd->efd_lock); in eventfd_write()
202 retry: in eventfd_write()
203 if (UINT64_MAX - efd->efd_count <= count) { in eventfd_write()
204 if ((fp->f_flag & FNONBLOCK) != 0) { in eventfd_write()
205 mtx_unlock(&efd->efd_lock); in eventfd_write()
207 uio->uio_resid += sizeof(eventfd_t); in eventfd_write()
210 error = mtx_sleep(&efd->efd_count, &efd->efd_lock, in eventfd_write()
213 goto retry; in eventfd_write()
216 MPASS(UINT64_MAX - efd->efd_count > count); in eventfd_write()
217 efd->efd_count += count; in eventfd_write()
218 KNOTE_LOCKED(&efd->efd_sel.si_note, 0); in eventfd_write()
219 selwakeup(&efd->efd_sel); in eventfd_write()
220 wakeup(&efd->efd_count); in eventfd_write()
222 mtx_unlock(&efd->efd_lock); in eventfd_write()
234 efd = fp->f_data; in eventfd_poll()
236 mtx_lock(&efd->efd_lock); in eventfd_poll()
237 if ((events & (POLLIN | POLLRDNORM)) != 0 && efd->efd_count > 0) in eventfd_poll()
239 if ((events & (POLLOUT | POLLWRNORM)) != 0 && UINT64_MAX - 1 > in eventfd_poll()
240 efd->efd_count) in eventfd_poll()
243 selrecord(td, &efd->efd_sel); in eventfd_poll()
244 mtx_unlock(&efd->efd_lock); in eventfd_poll()
252 struct eventfd *efd = fp->f_data; in eventfd_kqfilter()
254 mtx_lock(&efd->efd_lock); in eventfd_kqfilter()
255 switch (kn->kn_filter) { in eventfd_kqfilter()
257 kn->kn_fop = &eventfd_rfiltops; in eventfd_kqfilter()
260 kn->kn_fop = &eventfd_wfiltops; in eventfd_kqfilter()
263 mtx_unlock(&efd->efd_lock); in eventfd_kqfilter()
267 kn->kn_hook = efd; in eventfd_kqfilter()
268 knlist_add(&efd->efd_sel.si_note, kn, 1); in eventfd_kqfilter()
269 mtx_unlock(&efd->efd_lock); in eventfd_kqfilter()
277 struct eventfd *efd = kn->kn_hook; in filt_eventfddetach()
279 mtx_lock(&efd->efd_lock); in filt_eventfddetach()
280 knlist_remove(&efd->efd_sel.si_note, kn, 1); in filt_eventfddetach()
281 mtx_unlock(&efd->efd_lock); in filt_eventfddetach()
287 struct eventfd *efd = kn->kn_hook; in filt_eventfdread()
290 mtx_assert(&efd->efd_lock, MA_OWNED); in filt_eventfdread()
291 kn->kn_data = (int64_t)efd->efd_count; in filt_eventfdread()
292 ret = efd->efd_count > 0; in filt_eventfdread()
300 struct eventfd *efd = kn->kn_hook; in filt_eventfdwrite()
303 mtx_assert(&efd->efd_lock, MA_OWNED); in filt_eventfdwrite()
304 kn->kn_data = (int64_t)(UINT64_MAX - 1 - efd->efd_count); in filt_eventfdwrite()
305 ret = UINT64_MAX - 1 > efd->efd_count; in filt_eventfdwrite()
327 st->st_mode = S_IFIFO; in eventfd_stat()
334 struct eventfd *efd = fp->f_data; in eventfd_fill_kinfo()
336 kif->kf_type = KF_TYPE_EVENTFD; in eventfd_fill_kinfo()
337 mtx_lock(&efd->efd_lock); in eventfd_fill_kinfo()
338 kif->kf_un.kf_eventfd.kf_eventfd_value = efd->efd_count; in eventfd_fill_kinfo()
339 kif->kf_un.kf_eventfd.kf_eventfd_flags = efd->efd_flags; in eventfd_fill_kinfo()
340 kif->kf_un.kf_eventfd.kf_eventfd_addr = (uintptr_t)efd; in eventfd_fill_kinfo()
341 mtx_unlock(&efd->efd_lock); in eventfd_fill_kinfo()