int main(int argc, char **argv) { int server_socket; struct sockaddr_storage their_addr; // connector's address information socklen_t sin_size; int new_fd; struct request *req; pthread_attr_t attr; pthread_t thread_id; int i; server_opts(argc, argv); server_socket = server_setup_socket(); if (server_socket < 0) { exit(-1); } /* Initialize vars */ STAILQ_INIT(&requestq); pthread_cond_init(&req_cond, NULL); /* Start the detached worker threads */ pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); for (i = 0; i < workers; i++) { pthread_create(&thread_id, &attr, server_worker, NULL); } /* Accept connections */ while (1) { sin_size = sizeof(their_addr); new_fd = accept(server_socket, (struct sockaddr *)&their_addr, &sin_size); if (new_fd == -1) { perror("accept"); continue; } req = calloc(1, sizeof(struct request)); if (!req) { perror("calloc"); } req->fd = new_fd; pthread_mutex_lock(&req_mutex); STAILQ_INSERT_TAIL(&requestq, req, link); pthread_mutex_unlock(&req_mutex); pthread_cond_signal(&req_cond); } return 0; }
void server_start(server *s) { int i; s->base = event_base_new(); s->signal = event_new(s->base, SIGINT, EV_SIGNAL|EV_PERSIST, &server_sig_handler, s); event_add(s->signal, NULL); s->fd = server_setup_socket(s->cfg->ip, s->cfg->port); assert(s->fd != -1); /* start workers */ for(i=0; i<s->cfg->workers; i++) { worker_start(s->w[i]); } event_base_dispatch(s->base); server_free(s); exit(EXIT_SUCCESS); }