diff -ur st-1.1/sched.c st-1.1-p/sched.c --- st-1.1/sched.c Thu Dec 21 04:17:19 2000 +++ st-1.1-p/sched.c Mon Jun 11 08:46:56 2001 @@ -467,12 +467,9 @@ /* Gather all descriptors into one array */ for (q = _ST_IOQ.next; q != &_ST_IOQ; q = q->next) { pq = _ST_POLLQUEUE_PTR(q); - epds = pq->pds + pq->npds; - for (pds = pq->pds; pds < epds; pds++, pollfds++) { - ST_ASSERT(pollfds < _ST_POLLFDS + _ST_POLLFDS_SIZE); - *pollfds = *pds; - } + memcpy(pollfds, pq->pds, sizeof(struct pollfd) * pq->npds); + pollfds += pq->npds; } if (ST_CLIST_IS_EMPTY(&_ST_SLEEPQ)) { @@ -490,18 +487,18 @@ pollfds = _ST_POLLFDS; for (q = _ST_IOQ.next; q != &_ST_IOQ; q = q->next) { pq = _ST_POLLQUEUE_PTR(q); - epds = pq->pds + pq->npds; + epds = pollfds + pq->npds; notify = 0; - for (pds = pq->pds; pds < epds; pds++, pollfds++) { - ST_ASSERT(pollfds < _ST_POLLFDS + _ST_POLLFDS_SIZE); - ST_ASSERT(pollfds->fd == pds->fd); - pds->revents = pollfds->revents; - /* Negative fd's are ignored by poll() */ - if (pds->fd >= 0 && pds->revents) - notify = 1; - } + for (pds = pollfds; pds < epds; pds++) + /* Negative fd's are ignored by poll() */ + if (pds->revents && pds->fd >= 0) { + notify = 1; + break; + } + if (notify) { + memcpy(pq->pds, pollfds, sizeof(struct pollfd) * pq->npds); ST_REMOVE_LINK(&pq->links); pq->on_ioq = 0; @@ -513,6 +510,7 @@ _ST_OSFD_CNT -= pq->npds; ST_ASSERT(_ST_OSFD_CNT >= 0); } + pollfds += pq->npds; } } }