int eio_handle_mainloop(eio_handle_t *eio) { int retval = 0; struct pollfd *pollfds = NULL; eio_obj_t **map = NULL; unsigned int maxnfds = 0, nfds = 0; unsigned int n = 0; xassert (eio != NULL); xassert (eio->magic == EIO_MAGIC); for (;;) { /* Alloc memory for pfds and map if needed */ n = list_count(eio->obj_list); if (maxnfds < n) { maxnfds = n; xrealloc(pollfds, (maxnfds+1) * sizeof(struct pollfd)); xrealloc(map, maxnfds * sizeof(eio_obj_t * )); /* * Note: xrealloc() also handles initial malloc */ } debug4("eio: handling events for %d objects", list_count(eio->obj_list)); nfds = _poll_setup_pollfds(pollfds, map, eio->obj_list); if (nfds <= 0) goto done; /* * Setup eio handle signalling fd */ pollfds[nfds].fd = eio->fds[0]; pollfds[nfds].events = POLLIN; nfds++; xassert(nfds <= maxnfds + 1); if (_poll_internal(pollfds, nfds) < 0) goto error; if (pollfds[nfds-1].revents & POLLIN) _eio_wakeup_handler(eio); _poll_dispatch(pollfds, nfds-1, map, eio->obj_list); } error: retval = -1; done: xfree(pollfds); xfree(map); return retval; }
int eio_handle_mainloop(eio_handle_t *eio) { int retval = 0; struct pollfd *pollfds = NULL; eio_obj_t **map = NULL; unsigned int maxnfds = 0, nfds = 0; unsigned int n = 0; xassert (eio != NULL); xassert (eio->magic == EIO_MAGIC); for (;;) { /* Alloc memory for pfds and map if needed */ n = list_count(eio->obj_list); if (maxnfds < n) { maxnfds = n; xrealloc(pollfds, (maxnfds+1) * sizeof(struct pollfd)); xrealloc(map, maxnfds * sizeof(eio_obj_t * )); /* * Note: xrealloc() also handles initial malloc */ } debug4("eio: handling events for %d objects", list_count(eio->obj_list)); nfds = _poll_setup_pollfds(pollfds, map, eio->obj_list); if ((nfds <= 0) || (pollfds == NULL)) /* Fix for CLANG false positive */ goto done; /* * Setup eio handle signalling fd */ pollfds[nfds].fd = eio->fds[0]; pollfds[nfds].events = POLLIN; nfds++; xassert(nfds <= maxnfds + 1); if (_poll_internal(pollfds, nfds) < 0) goto error; if (pollfds[nfds-1].revents & POLLIN) _eio_wakeup_handler(eio); _poll_dispatch(pollfds, nfds-1, map, eio->obj_list); if (eio_shutdown_time && (difftime(time(NULL), eio_shutdown_time) >= EIO_SHUTDOWN_WAIT)) { error("Abandoning IO %d secs after job shutdown " "initiated", EIO_SHUTDOWN_WAIT); break; } } error: retval = -1; done: xfree(pollfds); xfree(map); return retval; }
int eio_handle_mainloop(eio_handle_t *eio) { int retval = 0; struct pollfd *pollfds = NULL; eio_obj_t **map = NULL; unsigned int maxnfds = 0, nfds = 0; unsigned int n = 0; time_t shutdown_time; xassert (eio != NULL); xassert (eio->magic == EIO_MAGIC); while (1) { /* Alloc memory for pfds and map if needed */ n = list_count(eio->obj_list); if (maxnfds < n) { maxnfds = n; xrealloc(pollfds, (maxnfds+1) * sizeof(struct pollfd)); xrealloc(map, maxnfds * sizeof(eio_obj_t *)); /* * Note: xrealloc() also handles initial malloc */ } if (!pollfds) /* Fix for CLANG false positive */ goto done; debug4("eio: handling events for %d objects", list_count(eio->obj_list)); nfds = _poll_setup_pollfds(pollfds, map, eio->obj_list); if (nfds <= 0) goto done; /* * Setup eio handle signalling fd */ pollfds[nfds].fd = eio->fds[0]; pollfds[nfds].events = POLLIN; nfds++; xassert(nfds <= maxnfds + 1); /* Get shutdown_time to pass to _poll_internal */ slurm_mutex_lock(&eio->shutdown_mutex); shutdown_time = eio->shutdown_time; slurm_mutex_unlock(&eio->shutdown_mutex); if (_poll_internal(pollfds, nfds, shutdown_time) < 0) goto error; /* See if we've been told to shut down by eio_signal_shutdown */ if (pollfds[nfds-1].revents & POLLIN) _eio_wakeup_handler(eio); _poll_dispatch(pollfds, nfds - 1, map, eio->obj_list); slurm_mutex_lock(&eio->shutdown_mutex); shutdown_time = eio->shutdown_time; slurm_mutex_unlock(&eio->shutdown_mutex); if (shutdown_time && (difftime(time(NULL), shutdown_time)>=eio->shutdown_wait)) { error("%s: Abandoning IO %d secs after job shutdown " "initiated", __func__, eio->shutdown_wait); break; } } error: retval = -1; done: xfree(pollfds); xfree(map); return retval; }