/*! \brief generic handle io routine, it will call the appropiate * handle_xxx() based on the fd_map type * * \param fm - pointer to a fd hash entry * \param idx - index in the fd_array (or -1 if not known) * \return -1 on error * 0 on EAGAIN or when by some other way it is known that no more * io events are queued on the fd (the receive buffer is empty). * Usefull to detect when there are no more io events queued for * sigio_rt, epoll_et, kqueue. * >0 on successfull read from the fd (when there might be more io * queued -- the receive buffer might still be non-empty) */ inline static int handle_io(struct fd_map* fm, int idx) { int ret; switch(fm->type){ case F_SOCKINFO: ret=handle_new_connect((struct socket_info*)fm->data); break; case F_TCPCONN: ret=handle_tcpconn_ev((struct tcp_connection*)fm->data, idx); break; case F_TCPCHILD: ret=handle_tcp_child((struct tcp_child*)fm->data, idx); break; case F_PROC: ret=handle_ser_child((struct process_table*)fm->data, idx); break; case F_NONE: LM_CRIT("empty fd map\n"); goto error; default: LM_CRIT("uknown fd type %d\n", fm->type); goto error; } return ret; error: return -1; }
/*! \brief generic handle io routine, it will call the appropiate * handle_xxx() based on the fd_map type * * \param fm - pointer to a fd hash entry * \param idx - index in the fd_array (or -1 if not known) * \return -1 on error * 0 on EAGAIN or when by some other way it is known that no more * io events are queued on the fd (the receive buffer is empty). * Usefull to detect when there are no more io events queued for * sigio_rt, epoll_et, kqueue. * >0 on successfull read from the fd (when there might be more io * queued -- the receive buffer might still be non-empty) */ inline static int handle_io(struct fd_map* fm, int idx,int event_type) { int ret; switch(fm->type){ case F_TCP_LISTENER: ret = handle_new_connect((struct socket_info*)fm->data); break; case F_TCPCONN: ret = handle_tcpconn_ev((struct tcp_connection*)fm->data, idx, event_type); break; case F_TCP_TCPWORKER: ret = handle_tcp_worker((struct tcp_child*)fm->data, idx); break; case F_TCP_WORKER: ret = handle_worker((struct process_table*)fm->data, idx); break; case F_NONE: LM_CRIT("empty fd map\n"); goto error; default: LM_CRIT("unknown fd type %d\n", fm->type); goto error; } return ret; error: return -1; }