void worker_waiting (worker *worker) { assert (worker); // Queue to broker and service waiting lists m_waiting.push_back(worker); worker->m_service->m_waiting.push_back(worker); worker->m_expiry = s_clock () + HEARTBEAT_EXPIRY; // Attempt to process outstanding requests service_dispatch (worker->m_service, 0); }
int main (int argc, char *argv[]) { int s_sockfd, c_sockfd; struct sockaddr_in s_addr; fd_set read_fds, test_fds; int fd, read_result; s_sockfd = socket (AF_INET, SOCK_STREAM, 0); s_addr.sin_family = AF_INET; s_addr.sin_addr.s_addr = htonl (INADDR_ANY); s_addr.sin_port = htons (SERVER_PORT); bind(s_sockfd, (struct sockaddr*) &s_addr, sizeof (s_addr)); listen(s_sockfd, 5); FD_ZERO (&read_fds); FD_SET (s_sockfd, &read_fds); while (1){ test_fds = read_fds; select (FD_SETSIZE, &test_fds, NULL, NULL, NULL); for (fd = 0; fd < FD_SETSIZE; fd++) { if ( !FD_ISSET(fd, &test_fds)) continue; if ( fd == s_sockfd) { c_sockfd = accept(s_sockfd, NULL, NULL); FD_SET(c_sockfd, &read_fds); } else { ioctl(fd, FIONREAD, &read_result); if ( read_result == 0) { close(fd); FD_CLR(fd, &read_fds); } else { service_dispatch(fd); } } } } }
void client_process (std::string sender, zmsg *msg) { assert (msg && msg->parts () >= 2); // Service name + body std::string service_name = (char *)msg->pop_front().c_str(); service *srv = service_require (service_name); // Set reply return address to client sender msg->wrap (sender.c_str(), ""); if (service_name.length() >= 4 && service_name.find_first_of("mmi.") == 0) { service_internal (service_name, msg); } else { service_dispatch (srv, msg); } }
static void *worker(void *p) { struct worker_param *wp = (struct worker_param *)p; struct watcher *watcher = wp->watcher; struct queue *q = 0; while (!watcher->quit) { q = service_dispatch(&wp->monitor, q); if (!q) { pthread_mutex_lock(&watcher->mutex); ++watcher->sleep; if (!watcher->quit) pthread_cond_wait(&watcher->cond, &watcher->mutex); --watcher->sleep; pthread_mutex_unlock(&watcher->mutex); } } return 0; }
static krb5_boolean service_fds(krb5_context context, struct select_state *selstate, time_ms interval, struct conn_state *conns, struct select_state *seltemp, const krb5_data *realm, int (*msg_handler)(krb5_context, const krb5_data *, void *), void *msg_handler_data, struct conn_state **winner_out) { int e, selret = 0; time_ms endtime; struct conn_state *state; *winner_out = NULL; e = get_curtime_ms(&endtime); if (e) return TRUE; endtime += interval; e = 0; while (selstate->nfds > 0) { e = cm_select_or_poll(selstate, get_endtime(endtime, conns), seltemp, &selret); if (e == EINTR) continue; if (e != 0) break; if (selret == 0) /* Timeout, return to caller. */ return FALSE; /* Got something on a socket, process it. */ for (state = conns; state != NULL; state = state->next) { int ssflags; if (state->fd == INVALID_SOCKET) continue; ssflags = cm_get_ssflags(seltemp, state->fd); if (!ssflags) continue; if (service_dispatch(context, realm, state, selstate, ssflags)) { int stop = 1; if (msg_handler != NULL) { krb5_data reply = make_data(state->in.buf, state->in.pos); stop = (msg_handler(context, &reply, msg_handler_data) != 0); } if (stop) { *winner_out = state; return TRUE; } } } } if (e != 0) return TRUE; return FALSE; }