Don't wrap global variables in a struct for no reason:

(LwpMaxfd, LwpNfds, LwpReadfds, LwpWritefds, LwpFdwait, LwpDelayq)
(LwpSelProc): New, matching members of LwpSelect, internal linkage.
(lwpSelect, LwpSelect): Remove.
This commit is contained in:
Markus Armbruster 2006-05-06 06:16:53 +00:00
parent 87c3790169
commit e86beb9626

View file

@ -46,29 +46,35 @@
#include "lwpint.h" #include "lwpint.h"
#include "prototypes.h" #include "prototypes.h"
struct lwpSelect { /* Largest fd in LwpReadfds, LwpWritefds */
int maxfd; static int LwpMaxfd;
int nfds;
fd_set readmask;
fd_set writemask;
struct lwpProc **wait;
struct lwpQueue delayq;
struct lwpProc *proc;
};
struct lwpSelect LwpSelect; /* Number of file descriptors in LwpReadfds, LwpWritefds */
static int LwpNfds;
/* File descriptors waited for in lwpSleepFd() */
static fd_set LwpReadfds, LwpWritefds;
/* Map file descriptor to thread sleeping in lwpSleepFd() */
static struct lwpProc **LwpFdwait;
/* Threads sleeping in lwpSleepUntil(), in no particular order */
static struct lwpQueue LwpDelayq;
/* The thread executing lwpSelect() */
static struct lwpProc *LwpSelProc;
void void
lwpInitSelect(struct lwpProc *proc) lwpInitSelect(struct lwpProc *proc)
{ {
LwpSelect.maxfd = 0; LwpMaxfd = 0;
LwpSelect.nfds = 0; LwpNfds = 0;
FD_ZERO(&LwpSelect.readmask); FD_ZERO(&LwpReadfds);
FD_ZERO(&LwpSelect.writemask); FD_ZERO(&LwpWritefds);
LwpSelect.wait = calloc(FD_SETSIZE, sizeof(struct lwpProc *)); LwpFdwait = calloc(FD_SETSIZE, sizeof(struct lwpProc *));
LwpSelect.delayq.head = 0; LwpDelayq.head = 0;
LwpSelect.delayq.tail = 0; LwpDelayq.tail = 0;
LwpSelect.proc = proc; LwpSelProc = proc;
} }
void void
@ -78,27 +84,27 @@ lwpSleepFd(int fd, int mask)
if (CANT_HAPPEN(fd > FD_SETSIZE)) if (CANT_HAPPEN(fd > FD_SETSIZE))
return; return;
if (LwpSelect.wait[fd] != 0) { if (LwpFdwait[fd] != 0) {
lwpStatus(LwpCurrent, lwpStatus(LwpCurrent,
"multiple sleeps attempted on file descriptor %d", fd); "multiple sleeps attempted on file descriptor %d", fd);
return; return;
} }
if (mask & LWP_FD_READ) if (mask & LWP_FD_READ)
FD_SET(fd, &LwpSelect.readmask); FD_SET(fd, &LwpReadfds);
if (mask & LWP_FD_WRITE) if (mask & LWP_FD_WRITE)
FD_SET(fd, &LwpSelect.writemask); FD_SET(fd, &LwpWritefds);
LwpSelect.nfds++; LwpNfds++;
if (LwpSelect.maxfd == 0 && LwpSelect.delayq.head == 0) { if (LwpMaxfd == 0 && LwpDelayq.head == 0) {
/* select process is sleeping until first waiter arrives */ /* select process is sleeping until first waiter arrives */
lwpStatus(LwpCurrent, "going to resched fd %d", fd); lwpStatus(LwpCurrent, "going to resched fd %d", fd);
lwpReady(LwpSelect.proc); lwpReady(LwpSelProc);
} }
lwpStatus(LwpCurrent, "going to wait on fd %d", fd); lwpStatus(LwpCurrent, "going to wait on fd %d", fd);
if (fd > LwpSelect.maxfd) if (fd > LwpMaxfd)
LwpSelect.maxfd = fd; LwpMaxfd = fd;
LwpSelect.wait[fd] = LwpCurrent; LwpFdwait[fd] = LwpCurrent;
LwpCurrent->fd = fd; LwpCurrent->fd = fd;
lwpReschedule(); lwpReschedule();
} }
@ -110,10 +116,10 @@ lwpWakeupFd(struct lwpProc *proc)
return; return;
lwpStatus(proc, "awakening; was sleeping on fd %d", proc->fd); lwpStatus(proc, "awakening; was sleeping on fd %d", proc->fd);
FD_CLR(proc->fd, &LwpSelect.readmask); FD_CLR(proc->fd, &LwpReadfds);
FD_CLR(proc->fd, &LwpSelect.writemask); FD_CLR(proc->fd, &LwpWritefds);
LwpSelect.nfds--; LwpNfds--;
LwpSelect.wait[proc->fd] = 0; LwpFdwait[proc->fd] = 0;
proc->fd = -1; proc->fd = -1;
lwpReady(proc); lwpReady(proc);
} }
@ -123,11 +129,11 @@ lwpSleepUntil(long until)
{ {
lwpStatus(LwpCurrent, "sleeping for %ld sec", until - time(0)); lwpStatus(LwpCurrent, "sleeping for %ld sec", until - time(0));
LwpCurrent->runtime = until; LwpCurrent->runtime = until;
if (LwpSelect.maxfd == 0 && LwpSelect.delayq.head == 0) { if (LwpMaxfd == 0 && LwpDelayq.head == 0) {
/* select process is sleeping until first waiter arrives */ /* select process is sleeping until first waiter arrives */
lwpReady(LwpSelect.proc); lwpReady(LwpSelProc);
} }
lwpAddTail(&LwpSelect.delayq, LwpCurrent); lwpAddTail(&LwpDelayq, LwpCurrent);
lwpReschedule(); lwpReschedule();
} }
@ -151,20 +157,20 @@ lwpSelect(void *arg)
FD_ZERO(&writemask); FD_ZERO(&writemask);
while (1) { while (1) {
while (1) { while (1) {
if (LwpSelect.nfds) if (LwpNfds)
break; break;
if (LwpSelect.delayq.head) if (LwpDelayq.head)
break; break;
/* wait for someone to lwpSleepFd or lwpSleepUntil */ /* wait for someone to lwpSleepFd or lwpSleepUntil */
LwpSelect.maxfd = 0; LwpMaxfd = 0;
lwpStatus(us, "no fds or sleepers, waiting"); lwpStatus(us, "no fds or sleepers, waiting");
lwpReschedule(); lwpReschedule();
} }
tv.tv_sec = 1000000; tv.tv_sec = 1000000;
tv.tv_usec = 0; tv.tv_usec = 0;
if (LwpSelect.delayq.head) { if (LwpDelayq.head) {
time(&now); time(&now);
proc = LwpSelect.delayq.head; proc = LwpDelayq.head;
for (; proc != 0; proc = proc->next) { for (; proc != 0; proc = proc->next) {
delta = proc->runtime - now; delta = proc->runtime - now;
if (delta < tv.tv_sec) if (delta < tv.tv_sec)
@ -175,9 +181,9 @@ lwpSelect(void *arg)
} }
lwpStatus(us, "selecting; sleep %ld secs", tv.tv_sec); lwpStatus(us, "selecting; sleep %ld secs", tv.tv_sec);
memcpy(&readmask, &LwpSelect.readmask, sizeof(fd_set)); memcpy(&readmask, &LwpReadfds, sizeof(fd_set));
memcpy(&writemask, &LwpSelect.writemask, sizeof(fd_set)); memcpy(&writemask, &LwpWritefds, sizeof(fd_set));
n = select(LwpSelect.maxfd + 1, &readmask, &writemask, NULL, &tv); n = select(LwpMaxfd + 1, &readmask, &writemask, NULL, &tv);
if (n < 0) { if (n < 0) {
if (errno != EINTR) { if (errno != EINTR) {
logerror("select failed (%s)", strerror(errno)); logerror("select failed (%s)", strerror(errno));
@ -189,11 +195,11 @@ lwpSelect(void *arg)
continue; continue;
} }
if (LwpSelect.delayq.head) { if (LwpDelayq.head) {
/* sleeping proecss activity */ /* sleeping proecss activity */
time(&now); time(&now);
save.tail = save.head = 0; save.tail = save.head = 0;
while (NULL != (proc = lwpGetFirst(&LwpSelect.delayq))) { while (NULL != (proc = lwpGetFirst(&LwpDelayq))) {
if (now >= proc->runtime) { if (now >= proc->runtime) {
lwpStatus(proc, "sleep done"); lwpStatus(proc, "sleep done");
lwpReady(proc); lwpReady(proc);
@ -201,21 +207,21 @@ lwpSelect(void *arg)
lwpAddTail(&save, proc); lwpAddTail(&save, proc);
} }
} }
LwpSelect.delayq = save; LwpDelayq = save;
} }
if (n > 0) { if (n > 0) {
/* file descriptor activity */ /* file descriptor activity */
for (fd = 0; fd <= LwpSelect.maxfd; fd++) { for (fd = 0; fd <= LwpMaxfd; fd++) {
if (LwpSelect.wait[fd] == 0) if (LwpFdwait[fd] == 0)
continue; continue;
if (FD_ISSET(fd, &readmask)) { if (FD_ISSET(fd, &readmask)) {
lwpStatus(LwpSelect.wait[fd], "input ready"); lwpStatus(LwpFdwait[fd], "input ready");
lwpWakeupFd(LwpSelect.wait[fd]); lwpWakeupFd(LwpFdwait[fd]);
continue; continue;
} }
if (FD_ISSET(fd, &writemask)) { if (FD_ISSET(fd, &writemask)) {
lwpStatus(LwpSelect.wait[fd], "output ready"); lwpStatus(LwpFdwait[fd], "output ready");
lwpWakeupFd(LwpSelect.wait[fd]); lwpWakeupFd(LwpFdwait[fd]);
continue; continue;
} }
} }