static void* _httpc_thread(void *hc_) { guint i; struct httpc *hc = hc_; while (hc->th_run) { qev_fd_t fds[] = { hc->polling, hc->waiting, }; for (i = 0; i < G_N_ELEMENTS(fds); i++) { _drain(hc, fds[i]); } g_usleep(100); } return NULL; }
static void _manage_events(struct network_server_s *srv) { struct network_client_s *clt; struct epoll_event allev[MAXEV], *pev; struct timespec now; int rc, erc; (void) rc; erc = epoll_wait(srv->epollfd, allev, MAXEV, 500); if (erc > 0) { network_server_now(&now); while (erc-- > 0) { pev = allev+erc; if (pev->data.ptr == srv->wakeup) continue; if (MAGIC_ENDPOINT == *((unsigned int*)(pev->data.ptr))) { struct endpoint_s *e = pev->data.ptr; while (NULL != (clt = _endpoint_manage_event(srv, e))) { if (clt->current_error) { _client_clean(srv, clt); } else { ARM_CLIENT(srv, clt, EPOLL_CTL_ADD); } } ARM_ENDPOINT(srv, e, EPOLL_CTL_MOD); } else { _manage_client_event(srv, pev->data.ptr, pev->events, &now); } } } _drain(srv->wakeup[0]); ARM_WAKER(srv, EPOLL_CTL_MOD); while (NULL != (clt = g_async_queue_try_pop(srv->queue_monitor))) { EXTRA_ASSERT(clt->events != 0 && !(clt->events & CLT_ERROR)); ARM_CLIENT(srv, clt, EPOLL_CTL_MOD); } }