- while (1) {
- if (LwpSelect.nfds)
- break;
- if (LwpSelect.delayq.head)
- break;
- /* wait for someone to lwpSleepFd or lwpSleepUntil */
- LwpSelect.maxfd = 0;
- lwpStatus(us, "no fds or sleepers, waiting");
- lwpReschedule();
- }
- tv.tv_sec = 1000000;
- tv.tv_usec = 0;
- if (LwpSelect.delayq.head) {
- time(&now);
- proc = LwpSelect.delayq.head;
- for ( ; proc != 0; proc = proc->next) {
- delta = proc->runtime - now;
- if (delta < tv.tv_sec)
- tv.tv_sec = delta;
- }
- if (tv.tv_sec < 0)
- tv.tv_sec = 0;
- }
- lwpStatus(us, "selecting; sleep %ld secs", (long)delta);
-
- bcopy((s_char *)&LwpSelect.readmask, (s_char *)&readmask, sizeof(fd_set));
- bcopy((s_char *)&LwpSelect.writemask, (s_char *)&writemask, sizeof(fd_set));
- n = select(LwpSelect.maxfd + 1, &readmask, &writemask,
- (fd_set *)0, &tv);
-
- if (n < 0) {
- if (errno == EINTR) {
- /* go handle the signal */
- lwpReady(us);
- lwpReschedule();
- continue;
- }
- lwpStatus(us,
- "select failed (bad file descriptor?)");
- exit(-1);
+ if (LwpSelect.nfds)
+ break;
+ if (LwpSelect.delayq.head)
+ break;
+ /* wait for someone to lwpSleepFd or lwpSleepUntil */
+ LwpSelect.maxfd = 0;
+ lwpStatus(us, "no fds or sleepers, waiting");
+ lwpReschedule();
+ }
+ tv.tv_sec = 1000000;
+ tv.tv_usec = 0;
+ if (LwpSelect.delayq.head) {
+ time(&now);
+ proc = LwpSelect.delayq.head;
+ for (; proc != 0; proc = proc->next) {
+ delta = proc->runtime - now;
+ if (delta < tv.tv_sec)
+ tv.tv_sec = delta;
+ }
+ if (tv.tv_sec < 0)
+ tv.tv_sec = 0;
+ }
+ lwpStatus(us, "selecting; sleep %ld secs", (long)delta);
+
+ bcopy((s_char *)&LwpSelect.readmask, (s_char *)&readmask,
+ sizeof(fd_set));
+ bcopy((s_char *)&LwpSelect.writemask, (s_char *)&writemask,
+ sizeof(fd_set));
+ n = select(LwpSelect.maxfd + 1, &readmask, &writemask,
+ (fd_set *) 0, &tv);
+
+ if (n < 0) {
+ if (errno == EINTR) {
+ /* go handle the signal */
+ lwpReady(us);
+ lwpReschedule();
+ continue;
+ }
+ lwpStatus(us, "select failed (bad file descriptor?)");
+ exit(-1);
+ }
+
+ if (LwpSelect.delayq.head) {
+ /* sleeping proecss activity */
+ time(&now);
+ save.tail = save.head = 0;
+ while (NULL != (proc = lwpGetFirst(&LwpSelect.delayq))) {
+ if (now >= proc->runtime) {
+ lwpStatus(proc, "sleep done");
+ lwpReady(proc);
+ } else {
+ lwpAddTail(&save, proc);