static dbus_bool_t handle_watch (DBusWatch *watch, unsigned int condition, void *data) { DBusBabysitter *sitter = data; int revents; int fd; revents = 0; if (condition & DBUS_WATCH_READABLE) revents |= _DBUS_POLLIN; if (condition & DBUS_WATCH_ERROR) revents |= _DBUS_POLLERR; if (condition & DBUS_WATCH_HANGUP) revents |= _DBUS_POLLHUP; fd = dbus_watch_get_fd (watch); if (fd == sitter->error_pipe_from_child) handle_error_pipe (sitter, revents); else if (fd == sitter->socket_to_babysitter) handle_babysitter_socket (sitter, revents); while (LIVE_CHILDREN (sitter) && babysitter_iteration (sitter, FALSE)) ; return TRUE; }
static dbus_bool_t handle_watch (DBusWatch *watch, unsigned int condition, void *data) { DBusBabysitter *sitter = data; int revents; int fd; revents = 0; if (condition & DBUS_WATCH_READABLE) revents |= _DBUS_POLLIN; if (condition & DBUS_WATCH_ERROR) revents |= _DBUS_POLLERR; if (condition & DBUS_WATCH_HANGUP) revents |= _DBUS_POLLHUP; fd = dbus_watch_get_socket (watch); if (fd == sitter->error_pipe_from_child) handle_error_pipe (sitter, revents); else if (fd == sitter->socket_to_babysitter) handle_babysitter_socket (sitter, revents); while (LIVE_CHILDREN (sitter) && babysitter_iteration (sitter, FALSE)) ; /* Those might have closed the sockets we're watching. Before returning * to the main loop, we must sort that out. */ if (sitter->error_watch != NULL && sitter->error_pipe_from_child == -1) { _dbus_watch_invalidate (sitter->error_watch); if (sitter->watches != NULL) _dbus_watch_list_remove_watch (sitter->watches, sitter->error_watch); _dbus_watch_unref (sitter->error_watch); sitter->error_watch = NULL; } if (sitter->sitter_watch != NULL && sitter->socket_to_babysitter == -1) { _dbus_watch_invalidate (sitter->sitter_watch); if (sitter->watches != NULL) _dbus_watch_list_remove_watch (sitter->watches, sitter->sitter_watch); _dbus_watch_unref (sitter->sitter_watch); sitter->sitter_watch = NULL; } return TRUE; }
/* returns whether there were any poll events handled */ static dbus_bool_t babysitter_iteration (DBusBabysitter *sitter, dbus_bool_t block) { DBusPollFD fds[2]; int i; dbus_bool_t descriptors_ready; descriptors_ready = FALSE; i = 0; if (sitter->error_pipe_from_child >= 0) { fds[i].fd = sitter->error_pipe_from_child; fds[i].events = _DBUS_POLLIN; fds[i].revents = 0; ++i; } if (sitter->socket_to_babysitter >= 0) { fds[i].fd = sitter->socket_to_babysitter; fds[i].events = _DBUS_POLLIN; fds[i].revents = 0; ++i; } if (i > 0) { int ret; ret = _dbus_poll (fds, i, 0); if (ret == 0 && block) ret = _dbus_poll (fds, i, -1); if (ret > 0) { descriptors_ready = TRUE; while (i > 0) { --i; if (fds[i].fd == sitter->error_pipe_from_child) handle_error_pipe (sitter, fds[i].revents); else if (fds[i].fd == sitter->socket_to_babysitter) handle_babysitter_socket (sitter, fds[i].revents); } } } return descriptors_ready; }
static dbus_bool_t handle_watch (DBusWatch *watch, unsigned int condition, void *data) { DBusBabysitter *sitter = _dbus_babysitter_ref (data); int revents; int fd; revents = 0; if (condition & DBUS_WATCH_READABLE) revents |= _DBUS_POLLIN; if (condition & DBUS_WATCH_ERROR) revents |= _DBUS_POLLERR; if (condition & DBUS_WATCH_HANGUP) revents |= _DBUS_POLLHUP; fd = dbus_watch_get_socket (watch); if (fd == sitter->error_pipe_from_child) handle_error_pipe (sitter, revents); else if (fd == sitter->socket_to_babysitter.fd) handle_babysitter_socket (sitter, revents); while (LIVE_CHILDREN (sitter) && babysitter_iteration (sitter, FALSE)) ; /* fd.o #32992: if the handle_* methods closed their sockets, they previously * didn't always remove the watches. Check that we don't regress. */ _dbus_assert (sitter->socket_to_babysitter.fd != -1 || sitter->sitter_watch == NULL); _dbus_assert (sitter->error_pipe_from_child != -1 || sitter->error_watch == NULL); if (_dbus_babysitter_get_child_exited (sitter) && sitter->finished_cb != NULL) { sitter->finished_cb (sitter, sitter->finished_data); sitter->finished_cb = NULL; } _dbus_babysitter_unref (sitter); return TRUE; }