Пример #1
0
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;
}
Пример #2
0
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);
	}
}