/* add a socket to be listened on */ static int engine_add(struct Socket* sock) { assert(0 != sock); assert(0 == sockList[s_fd(sock)]); /* bounds-check... */ if (s_fd(sock) >= FD_SETSIZE) { log_write(LS_SYSTEM, L_ERROR, 0, "Attempt to add socket %d (> %d) to event engine", s_fd(sock), FD_SETSIZE); return 0; } sockList[s_fd(sock)] = sock; /* add to list */ if (s_fd(sock) >= highest_fd) /* update highest_fd */ highest_fd = s_fd(sock); Debug((DEBUG_ENGINE, "select: Adding socket %d to engine [%p], state %s", s_fd(sock), sock, state_to_name(s_state(sock)))); /* set the fd set bits */ set_or_clear(s_fd(sock), 0, state_to_events(s_state(sock), s_events(sock))); return 1; /* success */ }
/** Handle change to preferred socket events. * @param[in] sock Socket getting new interest list. * @param[in] new_events New set of interesting events for socket. */ static void engine_events(struct Socket* sock, unsigned int new_events) { assert(0 != sock); assert(sock == sockList[s_fd(sock)]); Debug((DEBUG_ENGINE, "kqueue: Changing event mask for socket %p to [%s]", sock, sock_flags(new_events))); /* set the correct events */ set_or_clear(sock, state_to_events(s_state(sock), s_events(sock)), /* old events */ state_to_events(s_state(sock), new_events)); /* new events */ }
/* socket switching to new state */ static void engine_state(struct Socket* sock, enum SocketState new_state) { assert(0 != sock); assert(sock == sockList[s_fd(sock)]); Debug((DEBUG_ENGINE, "select: Changing state for socket %p to %s", sock, state_to_name(new_state))); /* set the correct events */ set_or_clear(s_fd(sock), state_to_events(s_state(sock), s_events(sock)), /* old state */ state_to_events(new_state, s_events(sock))); /* new state */ }
/** Add a socket to the event engine. * @param[in] sock Socket to add to engine. * @return Non-zero on success, or zero on error. */ static int engine_add(struct Socket* sock) { assert(0 != sock); assert(0 == sockList[s_fd(sock)]); /* bounds-check... */ if (sock->s_fd >= kqueue_max) { log_write(LS_SYSTEM, L_ERROR, 0, "Attempt to add socket %d (> %d) to event engine", s_fd(sock), kqueue_max); return 0; } sockList[s_fd(sock)] = sock; /* add to list */ Debug((DEBUG_ENGINE, "kqueue: Adding socket %d [%p], state %s, to engine", s_fd(sock), sock, state_to_name(s_state(sock)))); /* Add socket to queue */ set_or_clear(sock, 0, state_to_events(s_state(sock), s_events(sock))); return 1; /* success */ }