static int event_dispatch_poll (struct event_pool *event_pool) { struct pollfd *ufds = NULL; int size = 0; int i = 0; int ret = -1; GF_VALIDATE_OR_GOTO ("event", event_pool, out); while (1) { size = event_dispatch_poll_resize (event_pool, ufds, size); ufds = event_pool->evcache; ret = poll (ufds, size, 1); if (ret == 0) /* timeout */ continue; if (ret == -1 && errno == EINTR) /* sys call */ continue; for (i = 0; i < size; i++) { if (!ufds[i].revents) continue; event_dispatch_poll_handler (event_pool, ufds, i); } } out: return -1; }
static int event_dispatch_poll (struct event_pool *event_pool) { struct pollfd *ufds = NULL; int size = 0; int i = 0; int ret = -1; GF_VALIDATE_OR_GOTO ("event", event_pool, out); pthread_mutex_lock (&event_pool->mutex); { event_pool->activethreadcount = 1; } pthread_mutex_unlock (&event_pool->mutex); while (1) { pthread_mutex_lock (&event_pool->mutex); { if (event_pool->destroy == 1) { event_pool->activethreadcount = 0; pthread_cond_broadcast (&event_pool->cond); pthread_mutex_unlock (&event_pool->mutex); return 0; } } pthread_mutex_unlock (&event_pool->mutex); size = event_dispatch_poll_resize (event_pool, ufds, size); ufds = event_pool->evcache; ret = poll (ufds, size, 1); if (ret == 0) /* timeout */ continue; if (ret == -1 && errno == EINTR) /* sys call */ continue; for (i = 0; i < size; i++) { if (!ufds[i].revents) continue; event_dispatch_poll_handler (event_pool, ufds, i); } } out: return -1; }