diff --git a/lib/isc/task.c b/lib/isc/task.c index 1694ac76e9..8984ced005 100644 --- a/lib/isc/task.c +++ b/lib/isc/task.c @@ -213,7 +213,7 @@ task_finished(isc__task_t *task) { * any idle worker threads so they * can exit. */ - for (int i=0; iworkers; i++) { + for (unsigned i=0; iworkers; i++) { LOCK(&manager->locks[i]); BROADCAST(&manager->work_available[i]); UNLOCK(&manager->locks[i]); @@ -1159,11 +1159,11 @@ dispatch(isc__taskmgr_t *manager, int c) { if (manager->tasks_running == 0 && empty_readyq(manager, c)) { if (manager->mode != isc_taskmgrmode_normal) { manager->mode = isc_taskmgrmode_normal; - for (int i=0; iworkers; i++) { - if (i != c) + for (unsigned i=0; iworkers; i++) { + if (i != (unsigned)c) LOCK(&manager->locks[i]); BROADCAST(&manager->work_available[i]); - if (i != c) + if (i != (unsigned)c) UNLOCK(&manager->locks[i]); } } @@ -1542,7 +1542,7 @@ isc_task_endexclusive(isc_task_t *task0) { REQUIRE(manager->exclusive_requested); manager->exclusive_requested = false; UNLOCK(&manager->lock); - for (int i=0; i < manager->workers; i++) { + for (unsigned i=0; i < manager->workers; i++) { LOCK(&manager->locks[i]); BROADCAST(&manager->work_available[i]); UNLOCK(&manager->locks[i]); diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index e196424871..e67df9cc40 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -361,9 +361,7 @@ struct isc__socket { isc_sockaddr_t peer_address; /* remote address */ - unsigned int pending_recv : 1, - pending_send : 1, - pending_accept : 1, + unsigned int pending_accept : 1, listener : 1, /* listener socket */ connected : 1, connecting : 1, /* connect pending */ @@ -468,10 +466,6 @@ static isc_result_t allocate_socket(isc__socketmgr_t *, isc_sockettype_t, static void destroy(isc__socket_t **); static void internal_accept(isc_task_t *, isc_event_t *); static void internal_connect(isc_task_t *, isc_event_t *); -static void internal_recv(isc_task_t *, isc_event_t *); -static void internal_send(isc_task_t *, isc_event_t *); -static void internal_fdwatch_write(isc_task_t *, isc_event_t *); -static void internal_fdwatch_read(isc_task_t *, isc_event_t *); static void process_cmsg(isc__socket_t *, struct msghdr *, isc_socketevent_t *); static void build_msghdr_send(isc__socket_t *, char *, isc_socketevent_t *, struct msghdr *, struct iovec *, size_t *); @@ -756,7 +750,6 @@ watch_fd(isc__socketmgr_t *manager, int fd, int msg) { UNEXPECTED_ERROR(__FILE__, __LINE__, "epoll_ctl(ADD/MOD) returned " "EEXIST for fd %d", fd); - printf("CTL D failed %d %d %d %d %d %u %u %d\n", ret, errno, fd, manager->epoll_fds[fd % NUM_EPOLLS], op, oldevents, event.events, fd == manager->pipe_fds[0]); result = isc__errno2result(errno); } return (result); @@ -2148,8 +2141,6 @@ allocate_socket(isc__socketmgr_t *manager, isc_sockettype_t type, ISC_LIST_INIT(sock->send_list); ISC_LIST_INIT(sock->accept_list); ISC_LIST_INIT(sock->connect_list); - sock->pending_recv = 0; - sock->pending_send = 0; sock->pending_accept = 0; sock->listener = 0; sock->connected = 0; @@ -2209,8 +2200,6 @@ free_socket(isc__socket_t **socketp) { INSIST(VALID_SOCKET(sock)); INSIST(sock->references == 0); INSIST(!sock->connecting); - INSIST(!sock->pending_recv); - INSIST(!sock->pending_send); INSIST(!sock->pending_accept); INSIST(ISC_LIST_EMPTY(sock->recv_list)); INSIST(ISC_LIST_EMPTY(sock->send_list)); @@ -2984,16 +2973,14 @@ isc_socket_fdwatchpoke(isc_socket_t *sock0, int flags) if ((flags & (ISC_SOCKFDWATCH_READ | ISC_SOCKFDWATCH_WRITE)) != 0) { LOCK(&sock->recvlock); - bool doit = (((flags & ISC_SOCKFDWATCH_READ) != 0) && - !sock->pending_recv); + bool doit = (((flags & ISC_SOCKFDWATCH_READ) != 0)); UNLOCK(&sock->recvlock); if (doit) select_poke(sock->manager, sock->fd, SELECT_POKE_READ); LOCK(&sock->sendlock); - doit = (((flags & ISC_SOCKFDWATCH_WRITE) != 0) && - !sock->pending_send); + doit = (((flags & ISC_SOCKFDWATCH_WRITE) != 0)); UNLOCK(&sock->sendlock); if (doit) select_poke(sock->manager, sock->fd, @@ -3070,8 +3057,6 @@ isc_socket_close(isc_socket_t *sock0) { REQUIRE(sock->fd >= 0 && sock->fd < (int)sock->manager->maxsocks); INSIST(!sock->connecting); - INSIST(!sock->pending_recv); - INSIST(!sock->pending_send); INSIST(!sock->pending_accept); INSIST(ISC_LIST_EMPTY(sock->recv_list)); INSIST(ISC_LIST_EMPTY(sock->send_list)); @@ -3098,83 +3083,6 @@ isc_socket_close(isc_socket_t *sock0) { return (ISC_R_SUCCESS); } -/* - * I/O is possible on a given socket. Schedule an event to this task that - * will call an internal function to do the I/O. This will charge the - * task with the I/O operation and let our select loop handler get back - * to doing something real as fast as possible. - * - * The socket and manager must be locked before calling this function. - */ -static void -dispatch_recv(isc__socket_t *sock) { - intev_t *iev; - isc_socketevent_t *ev; - isc_task_t *sender; - - INSIST(!sock->pending_recv); - - if (sock->type != isc_sockettype_fdwatch) { - ev = ISC_LIST_HEAD(sock->recv_list); - if (ev == NULL) - return; - socket_log(sock, NULL, EVENT, NULL, 0, 0, - "dispatch_recv: event %p -> task %p", - ev, ev->ev_sender); - sender = ev->ev_sender; - } else { - sender = sock->fdwatchtask; - } - - sock->pending_recv = 1; - iev = &sock->readable_ev; - - sock->references++; - iev->ev_sender = sock; - if (sock->type == isc_sockettype_fdwatch) - iev->ev_action = internal_fdwatch_read; - else - iev->ev_action = internal_recv; - iev->ev_arg = sock; - UNLOCK(&sock->recvlock); - isc_task_send(sender, (isc_event_t **)&iev); - LOCK(&sock->recvlock); -} - -static void -dispatch_send(isc__socket_t *sock) { - intev_t *iev; - isc_socketevent_t *ev; - isc_task_t *sender; - - INSIST(!sock->pending_send); - - if (sock->type != isc_sockettype_fdwatch) { - ev = ISC_LIST_HEAD(sock->send_list); - if (ev == NULL) - return; - socket_log(sock, NULL, EVENT, NULL, 0, 0, - "dispatch_send: event %p -> task %p", - ev, ev->ev_sender); - sender = ev->ev_sender; - } else { - sender = sock->fdwatchtask; - } - - sock->pending_send = 1; - iev = &sock->writable_ev; - - sock->references++; - iev->ev_sender = sock; - if (sock->type == isc_sockettype_fdwatch) - iev->ev_action = internal_fdwatch_write; - else - iev->ev_action = internal_send; - iev->ev_arg = sock; - - isc_task_send(sender, (isc_event_t **)&iev); -} - /* * Dispatch an internal accept event. */ @@ -3570,34 +3478,14 @@ internal_accept(isc_task_t *me, isc_event_t *ev) { } static void -internal_recv(isc_task_t *me, isc_event_t *ev) { +internal_recv(isc__socket_t *sock) { isc_socketevent_t *dev; - isc__socket_t *sock; - bool locked = true; - - INSIST(ev->ev_type == ISC_SOCKEVENT_INTR); - - sock = ev->ev_sender; INSIST(VALID_SOCKET(sock)); - socket_log(sock, NULL, IOEVENT, - isc_msgcat, ISC_MSGSET_SOCKET, ISC_MSG_INTERNALRECV, - "internal_recv: task %p got event %p", me, ev); - - LOCK(&sock->sendlock); - LOCK(&sock->recvlock); - INSIST(sock->pending_recv == 1); - sock->pending_recv = 0; - - INSIST(sock->references > 0); - sock->references--; /* the internal event is done with this socket */ if (sock->references == 0) { - UNLOCK(&sock->recvlock); destroy(&sock); return; } - UNLOCK(&sock->recvlock); - UNLOCK(&sock->sendlock); LOCK(&sock->recvlock); /* * Try to do as much I/O as possible on this socket. There are no @@ -3635,39 +3523,20 @@ internal_recv(isc_task_t *me, isc_event_t *ev) { } poke: - if (!ISC_LIST_EMPTY(sock->recv_list)) { - if (locked) - UNLOCK(&sock->recvlock); - select_poke(sock->manager, sock->fd, SELECT_POKE_READ); - } else { - if (locked) - UNLOCK(&sock->recvlock); - } + if (!ISC_LIST_EMPTY(sock->recv_list)) + watch_fd(sock->manager, sock->fd, SELECT_POKE_READ); + + UNLOCK(&sock->recvlock); } static void -internal_send(isc_task_t *me, isc_event_t *ev) { +internal_send(isc__socket_t *sock) { isc_socketevent_t *dev; - isc__socket_t *sock; - - INSIST(ev->ev_type == ISC_SOCKEVENT_INTW); - - /* - * Find out what socket this is and lock it. - */ - sock = (isc__socket_t *)ev->ev_sender; + INSIST(VALID_SOCKET(sock)); LOCK(&sock->sendlock); - socket_log(sock, NULL, IOEVENT, - isc_msgcat, ISC_MSGSET_SOCKET, ISC_MSG_INTERNALSEND, - "internal_send: task %p got event %p", me, ev); - INSIST(sock->pending_send == 1); - sock->pending_send = 0; - - INSIST(sock->references > 0); - sock->references--; /* the internal event is done with this socket */ if (sock->references == 0) { UNLOCK(&sock->sendlock); destroy(&sock); @@ -3695,94 +3564,11 @@ internal_send(isc_task_t *me, isc_event_t *ev) { poke: if (!ISC_LIST_EMPTY(sock->send_list)) - select_poke(sock->manager, sock->fd, SELECT_POKE_WRITE); + watch_fd(sock->manager, sock->fd, SELECT_POKE_WRITE); UNLOCK(&sock->sendlock); } -static void -internal_fdwatch_write(isc_task_t *me, isc_event_t *ev) { - isc__socket_t *sock; - int more_data; - - INSIST(ev->ev_type == ISC_SOCKEVENT_INTW); - - /* - * Find out what socket this is and lock it. - */ - sock = (isc__socket_t *)ev->ev_sender; - INSIST(VALID_SOCKET(sock)); - - LOCK(&sock->sendlock); - socket_log(sock, NULL, IOEVENT, - isc_msgcat, ISC_MSGSET_SOCKET, ISC_MSG_INTERNALSEND, - "internal_fdwatch_write: task %p got event %p", me, ev); - - INSIST(sock->pending_send == 1); - - UNLOCK(&sock->sendlock); - more_data = (sock->fdwatchcb)(me, (isc_socket_t *)sock, - sock->fdwatcharg, ISC_SOCKFDWATCH_WRITE); - LOCK(&sock->sendlock); - - sock->pending_send = 0; - - INSIST(sock->references > 0); - sock->references--; /* the internal event is done with this socket */ - if (sock->references == 0) { - UNLOCK(&sock->sendlock); - destroy(&sock); - return; - } - - if (more_data) - select_poke(sock->manager, sock->fd, SELECT_POKE_WRITE); - - UNLOCK(&sock->sendlock); -} - -static void -internal_fdwatch_read(isc_task_t *me, isc_event_t *ev) { - isc__socket_t *sock; - int more_data; - - INSIST(ev->ev_type == ISC_SOCKEVENT_INTR); - - /* - * Find out what socket this is and lock it. - */ - sock = (isc__socket_t *)ev->ev_sender; - INSIST(VALID_SOCKET(sock)); - - LOCK(&sock->recvlock); - socket_log(sock, NULL, IOEVENT, - isc_msgcat, ISC_MSGSET_SOCKET, ISC_MSG_INTERNALRECV, - "internal_fdwatch_read: task %p got event %p", me, ev); - - INSIST(sock->pending_recv == 1); - - UNLOCK(&sock->recvlock); - more_data = (sock->fdwatchcb)(me, (isc_socket_t *)sock, - sock->fdwatcharg, ISC_SOCKFDWATCH_READ); - LOCK(&sock->recvlock); - - sock->pending_recv = 0; - - INSIST(sock->references > 0); - sock->references--; /* the internal event is done with this socket */ - if (sock->references == 0) { - UNLOCK(&sock->recvlock); - destroy(&sock); - return; - } - - UNLOCK(&sock->recvlock); - - if (more_data) - select_poke(sock->manager, sock->fd, SELECT_POKE_READ); - -} - /* * Process read/writes on each fd here. Avoid locking * and unlocking twice if both reads and writes are possible. @@ -3815,13 +3601,13 @@ process_fd(isc__socketmgr_t *manager, int fd, bool readable, unwatch_read = true; goto check_write; } - unlock_sock_recv = true; - LOCK(&sock->recvlock); if (!SOCK_DEAD(sock)) { - if (sock->listener) + if (sock->listener) { + unlock_sock_recv = true; + LOCK(&sock->recvlock); dispatch_accept(sock); - else - dispatch_recv(sock); + } else + internal_recv(sock); } unwatch_read = true; } @@ -3831,14 +3617,13 @@ check_write: unwatch_write = true; goto unlock_fd; } - unlock_sock_write = true; - LOCK(&sock->sendlock); - if (!SOCK_DEAD(sock)) { - if (sock->connecting) + if (sock->connecting) { + unlock_sock_write = true; + LOCK(&sock->sendlock); dispatch_connect(sock); - else - dispatch_send(sock); + } else + internal_send(sock); } unwatch_write = true; } @@ -4287,7 +4072,6 @@ setup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) { UNEXPECTED_ERROR(__FILE__, __LINE__, "epoll_ctl(ADD/MOD) returned " "EEXIST for fd %d", fd); - printf("CTL failed %d %d %d %d %d %u %u %d\n", ret, errno, fd, manager->epoll_fds[fd % NUM_EPOLLS], op, oldevents, event.events, fd == manager->pipe_fds[0]); result = isc__errno2result(errno); return (result); } @@ -4403,7 +4187,7 @@ setup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) { static void cleanup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) { - isc_result_t result; + isc_result_t result = ISC_R_SUCCESS; // FOO result = unwatch_fd(manager, manager->pipe_fds[0], SELECT_POKE_READ); if (result != ISC_R_SUCCESS) { @@ -4529,7 +4313,7 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp, * Create the special fds that will be used to wake up the * select/poll loop when something internal needs to be done. */ - for (int i=0; i < NUM_EPOLLS; i++) { + for (i=0; i < NUM_EPOLLS; i++) { if (pipe(manager->pipe_fds[i]) != 0) { isc__strerror(errno, strbuf, sizeof(strbuf)); UNEXPECTED_ERROR(__FILE__, __LINE__, @@ -4556,7 +4340,7 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp, * Start up the select/poll thread. */ isc_mem_attach(mctx, &manager->mctx); - for (int i=0; imanager = manager; m->id = i; @@ -4586,7 +4370,7 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp, return (ISC_R_SUCCESS); cleanup: - for (int i=0; i< NUM_EPOLLS; i++) { + for (i=0; i< NUM_EPOLLS; i++) { (void)close(manager->pipe_fds[i][0]); (void)close(manager->pipe_fds[i][1]); } @@ -4683,13 +4467,13 @@ isc_socketmgr_destroy(isc_socketmgr_t **managerp) { * half of the pipe, which will send EOF to the read half. * This is currently a no-op in the non-threaded case. */ - for (int i=0; iwatcher[i], NULL) != ISC_R_SUCCESS) UNEXPECTED_ERROR(__FILE__, __LINE__, "isc_thread_join() %s", @@ -4702,7 +4486,7 @@ isc_socketmgr_destroy(isc_socketmgr_t **managerp) { */ cleanup_watcher(manager->mctx, manager); - for (int i=0; ipipe_fds[i][0]); (void)close(manager->pipe_fds[i][1]); } @@ -4786,7 +4570,7 @@ socket_recv(isc__socket_t *sock, isc_socketevent_t *dev, isc_task_t *task, * Enqueue the request. If the socket was previously not being * watched, poke the watcher to start paying attention to it. */ - poke = (ISC_LIST_EMPTY(sock->recv_list) && !sock->pending_recv); + poke = (ISC_LIST_EMPTY(sock->recv_list)); ISC_LIST_ENQUEUE(sock->recv_list, dev, ev_link); @@ -4995,8 +4779,7 @@ socket_send(isc__socket_t *sock, isc_socketevent_t *dev, isc_task_t *task, * not being watched, poke the watcher to start * paying attention to it. */ - if (ISC_LIST_EMPTY(sock->send_list) && - !sock->pending_send) + if (ISC_LIST_EMPTY(sock->send_list)) select_poke(sock->manager, sock->fd, SELECT_POKE_WRITE); ISC_LIST_ENQUEUE(sock->send_list, dev, ev_link); @@ -6312,14 +6095,6 @@ isc_socketmgr_renderxml(isc_socketmgr_t *mgr0, xmlTextWriterPtr writer) { } TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "states")); - if (sock->pending_recv) - TRY0(xmlTextWriterWriteElement(writer, - ISC_XMLCHAR "state", - ISC_XMLCHAR "pending-receive")); - if (sock->pending_send) - TRY0(xmlTextWriterWriteElement(writer, - ISC_XMLCHAR "state", - ISC_XMLCHAR "pending-send")); if (sock->pending_accept) TRY0(xmlTextWriterWriteElement(writer, ISC_XMLCHAR "state", @@ -6431,18 +6206,6 @@ isc_socketmgr_renderjson(isc_socketmgr_t *mgr0, json_object *stats) { CHECKMEM(states); json_object_object_add(entry, "states", states); - if (sock->pending_recv) { - obj = json_object_new_string("pending-receive"); - CHECKMEM(obj); - json_object_array_add(states, obj); - } - - if (sock->pending_send) { - obj = json_object_new_string("pending-send"); - CHECKMEM(obj); - json_object_array_add(states, obj); - } - if (sock->pending_accept) { obj = json_object_new_string("pending-accept"); CHECKMEM(obj); diff --git a/lib/isc/xoshiro128starstar.c b/lib/isc/xoshiro128starstar.c index 43cc958313..ca863a565c 100644 --- a/lib/isc/xoshiro128starstar.c +++ b/lib/isc/xoshiro128starstar.c @@ -60,7 +60,7 @@ static volatile HANDLE _mutex = NULL; #else /* defined(_WIN32) || defined(_WIN64) */ #include -static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER; +//static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER; #define _LOCK() pthread_mutex_lock(&_mutex) #define _UNLOCK() pthread_mutex_unlock(&_mutex) #endif /* defined(_WIN32) || defined(_WIN64) */