diff options
Diffstat (limited to 'usr/mgmt_ipc.c')
-rw-r--r-- | usr/mgmt_ipc.c | 98 |
1 files changed, 5 insertions, 93 deletions
diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c index e4e16d2..e784bca 100644 --- a/usr/mgmt_ipc.c +++ b/usr/mgmt_ipc.c @@ -25,19 +25,16 @@ #include <errno.h> #include <unistd.h> #include <pwd.h> -#include <sys/poll.h> #include <sys/un.h> -#include <sys/wait.h> #include "iscsid.h" #include "idbm.h" #include "mgmt_ipc.h" -#include "iscsi_ipc.h" +#include "event_poll.h" #include "log.h" #include "transport.h" #include "sysdeps.h" - -static int leave_event_loop = 0; +#include "iscsi_ipc.h" #define PEERUSER_MAX 64 #define EXTMSG_MAX (64 * 1024) @@ -77,7 +74,7 @@ mgmt_ipc_listen(void) void mgmt_ipc_close(int fd) { - leave_event_loop = 1; + event_loop_exit(); if (fd >= 0) close(fd); } @@ -193,7 +190,7 @@ mgmt_ipc_conn_add(queue_task_t *qtask) static mgmt_ipc_err_e mgmt_ipc_immediate_stop(queue_task_t *qtask) { - leave_event_loop = 1; + event_loop_exit(); mgmt_ipc_write_rsp(qtask, MGMT_IPC_OK); return MGMT_IPC_OK; } @@ -529,8 +526,7 @@ static mgmt_ipc_fn_t * mgmt_ipc_functions[__MGMT_IPC_MAX_COMMAND] = { [MGMT_IPC_NOTIFY_DEL_PORTAL] = mgmt_ipc_notify_del_portal, }; -static void -mgmt_ipc_handle(int accept_fd) +void mgmt_ipc_handle(int accept_fd) { unsigned int command; int fd, err; @@ -582,87 +578,3 @@ err: * connection and free the qtask */ mgmt_ipc_write_rsp(qtask, err); } - -static int reap_count; - -void -need_reap(void) -{ - reap_count++; -} - -static void -reaper(void) -{ - int rc; - - /* - * We don't really need reap_count, but calling wait() all the - * time seems execessive. - */ - if (reap_count) { - rc = waitpid(0, NULL, WNOHANG); - if (rc > 0) { - reap_count--; - log_debug(6, "reaped pid %d, reap_count now %d", - rc, reap_count); - } - } -} - -#define POLL_CTRL 0 -#define POLL_IPC 1 -#define POLL_ISNS 2 -#define POLL_MAX 3 - -/* TODO: this should go somewhere else */ -void event_loop(struct iscsi_ipc *ipc, int control_fd, int mgmt_ipc_fd, - int isns_fd) -{ - struct pollfd poll_array[POLL_MAX]; - int res; - - poll_array[POLL_CTRL].fd = control_fd; - poll_array[POLL_CTRL].events = POLLIN; - poll_array[POLL_IPC].fd = mgmt_ipc_fd; - poll_array[POLL_IPC].events = POLLIN; - - if (isns_fd < 0) - poll_array[POLL_ISNS].fd = poll_array[POLL_ISNS].events = 0; - else { - poll_array[POLL_ISNS].fd = isns_fd; - poll_array[POLL_ISNS].events = POLLIN; - } - - leave_event_loop = 0; - while (!leave_event_loop) { - res = poll(poll_array, POLL_MAX, ACTOR_RESOLUTION); - if (res > 0) { - log_debug(6, "poll result %d", res); - /* - * flush sysfs cache since kernel objs may - * have changed as a result of handling op - */ - sysfs_cleanup(); - if (poll_array[POLL_CTRL].revents) - ipc->ctldev_handle(); - - if (poll_array[POLL_IPC].revents) - mgmt_ipc_handle(mgmt_ipc_fd); - - if (poll_array[POLL_ISNS].revents) - isns_handle(isns_fd); - - } else if (res < 0) { - if (errno == EINTR) { - log_debug(1, "event_loop interrupted"); - } else { - log_error("got poll() error (%d), errno (%d), " - "exiting", res, errno); - break; - } - } else - actor_poll(); - reaper(); - } -} |