return;
}
if (flags & TEVENT_FD_READ) {
+ if (!bsds->readable_handler) {
+ TEVENT_FD_NOT_READABLE(bsds->fde);
+ return;
+ }
bsds->readable_handler(bsds->readable_private);
return;
}
errno = EINVAL;
return -1;
}
-
+ if (!bsds->readable_handler) {
+ return 0;
+ }
bsds->readable_handler = NULL;
bsds->readable_private = NULL;
- TEVENT_FD_NOT_READABLE(bsds->fde);
- if (bsds->fde && !bsds->writeable_handler) {
- /* we don't need the fd event anymore */
- bsds->event_ptr = NULL;
- TALLOC_FREE(bsds->fde);
- }
return 0;
}
+ /* read and write must use the same tevent_context */
+ if (bsds->event_ptr != ev) {
+ if (bsds->readable_handler || bsds->writeable_handler) {
+ errno = EINVAL;
+ return -1;
+ }
+ bsds->event_ptr = NULL;
+ TALLOC_FREE(bsds->fde);
+ }
+
if (bsds->fde == NULL) {
bsds->fde = tevent_add_fd(ev, bsds,
bsds->fd, TEVENT_FD_READ,
/* cache the event context we're running on */
bsds->event_ptr = ev;
+ } else if (!bsds->readable_handler) {
+ TEVENT_FD_READABLE(bsds->fde);
}
- /* read and write must use the same tevent_context */
- if (bsds->event_ptr != ev) {
- errno = EINVAL;
- return -1;
- }
-
- TEVENT_FD_READABLE(bsds->fde);
bsds->readable_handler = handler;
bsds->readable_private = private_data;
errno = EINVAL;
return -1;
}
-
+ if (!bsds->writeable_handler) {
+ return 0;
+ }
bsds->writeable_handler = NULL;
bsds->writeable_private = NULL;
TEVENT_FD_NOT_WRITEABLE(bsds->fde);
- if (bsds->fde && !bsds->readable_handler) {
- /* we don't need the fd event anymore */
- bsds->event_ptr = NULL;
- TALLOC_FREE(bsds->fde);
- }
return 0;
}
+ /* read and write must use the same tevent_context */
+ if (bsds->event_ptr != ev) {
+ if (bsds->readable_handler || bsds->writeable_handler) {
+ errno = EINVAL;
+ return -1;
+ }
+ bsds->event_ptr = NULL;
+ TALLOC_FREE(bsds->fde);
+ }
+
if (bsds->fde == NULL) {
bsds->fde = tevent_add_fd(ev, bsds,
bsds->fd, TEVENT_FD_WRITE,
/* cache the event context we're running on */
bsds->event_ptr = ev;
+ } else if (!bsds->writeable_handler) {
+ TEVENT_FD_WRITEABLE(bsds->fde);
}
- /* read and write must use the same tevent_context */
- if (bsds->event_ptr != ev) {
- errno = EINVAL;
- return -1;
- }
-
- TEVENT_FD_WRITEABLE(bsds->fde);
bsds->writeable_handler = handler;
bsds->writeable_private = private_data;
goto post;
}
+ /*
+ * this is a fast path, not waiting for the
+ * socket to become explicit readable gains
+ * about 10%-20% performance in benchmark tests.
+ */
+ tdgram_bsd_recvfrom_handler(req);
+ if (!tevent_req_is_in_progress(req)) {
+ goto post;
+ }
+
ret = tdgram_bsd_set_readable_handler(bsds, ev,
tdgram_bsd_recvfrom_handler,
req);