void tcp_worker_proc( int unix_sock, int max_fd ) { /* init reactor for TCP worker */ tcpmain_sock=unix_sock; /* init com. socket */ if ( init_worker_reactor( "TCP_worker", max_fd, RCT_PRIO_MAX)<0 ) { goto error; } /* start watching for the timer jobs */ if (reactor_add_reader( timer_fd_out, F_TIMER_JOB, RCT_PRIO_TIMER,NULL)<0){ LM_CRIT("failed to add timer pipe_out to reactor\n"); goto error; } /* add the unix socket */ if (reactor_add_reader( tcpmain_sock, F_TCPMAIN, RCT_PRIO_PROC, NULL)<0) { LM_CRIT("failed to add socket to the fd list\n"); goto error; } /* main loop */ reactor_main_loop( TCP_CHILD_SELECT_TIMEOUT, error, tcp_receive_timeout()); error: destroy_worker_reactor(); LM_CRIT("exiting..."); exit(-1); }
void tcp_receive_loop(int unix_sock) { /* init */ tcpmain_sock=unix_sock; /* init com. socket */ if (init_io_wait(&io_w, tcp_max_fd_no, tcp_poll_method)<0) goto error; /* add the unix socket */ if (io_watch_add(&io_w, tcpmain_sock, F_TCPMAIN, 0)<0){ LM_CRIT("failed to add socket to the fd list\n"); goto error; } /* main loop */ switch(io_w.poll_method){ case POLL_POLL: while(1){ io_wait_loop_poll(&io_w, TCP_CHILD_SELECT_TIMEOUT, 0); tcp_receive_timeout(); } break; #ifdef HAVE_SELECT case POLL_SELECT: while(1){ io_wait_loop_select(&io_w, TCP_CHILD_SELECT_TIMEOUT, 0); tcp_receive_timeout(); } break; #endif #ifdef HAVE_SIGIO_RT case POLL_SIGIO_RT: while(1){ io_wait_loop_sigio_rt(&io_w, TCP_CHILD_SELECT_TIMEOUT); tcp_receive_timeout(); } break; #endif #ifdef HAVE_EPOLL case POLL_EPOLL_LT: while(1){ io_wait_loop_epoll(&io_w, TCP_CHILD_SELECT_TIMEOUT, 0); tcp_receive_timeout(); } break; case POLL_EPOLL_ET: while(1){ io_wait_loop_epoll(&io_w, TCP_CHILD_SELECT_TIMEOUT, 1); tcp_receive_timeout(); } break; #endif #ifdef HAVE_KQUEUE case POLL_KQUEUE: while(1){ io_wait_loop_kqueue(&io_w, TCP_CHILD_SELECT_TIMEOUT, 0); tcp_receive_timeout(); } break; #endif #ifdef HAVE_DEVPOLL case POLL_DEVPOLL: while(1){ io_wait_loop_devpoll(&io_w, TCP_CHILD_SELECT_TIMEOUT, 0); tcp_receive_timeout(); } break; #endif default: LM_CRIT("no support for poll method %s (%d)\n", poll_method_name(io_w.poll_method), io_w.poll_method); goto error; } error: destroy_io_wait(&io_w); LM_CRIT("exiting..."); exit(-1); }