Indented with src/scripts/indent-emp.

This commit is contained in:
Markus Armbruster 2003-09-02 20:48:48 +00:00
parent 5f263a7753
commit 9b7adfbecc
437 changed files with 52211 additions and 51052 deletions

View file

@ -50,201 +50,204 @@
#if defined(_EMPTH_LWP)
struct lwpSelect {
int maxfd;
int nfds;
int nfile;
fd_set readmask;
fd_set writemask;
struct lwpProc **wait;
struct lwpQueue delayq;
struct lwpProc *proc;
int maxfd;
int nfds;
int nfile;
fd_set readmask;
fd_set writemask;
struct lwpProc **wait;
struct lwpQueue delayq;
struct lwpProc *proc;
};
struct lwpSelect LwpSelect;
void lwpInitSelect(proc)
struct lwpProc *proc;
void
lwpInitSelect(proc)
struct lwpProc *proc;
{
LwpSelect.maxfd = 0;
LwpSelect.nfds = 0;
LwpSelect.maxfd = 0;
LwpSelect.nfds = 0;
#ifdef hpux
LwpSelect.nfile = _NFILE;
LwpSelect.nfile = _NFILE;
#else
LwpSelect.nfile = getdtablesize();
LwpSelect.nfile = getdtablesize();
#endif
FD_ZERO(&LwpSelect.readmask);
FD_ZERO(&LwpSelect.writemask);
LwpSelect.wait = (struct lwpProc **)
calloc(LwpSelect.nfile, sizeof(char *));
LwpSelect.delayq.head = 0;
LwpSelect.delayq.tail = 0;
LwpSelect.proc = proc;
FD_ZERO(&LwpSelect.readmask);
FD_ZERO(&LwpSelect.writemask);
LwpSelect.wait = (struct lwpProc **)
calloc(LwpSelect.nfile, sizeof(char *));
LwpSelect.delayq.head = 0;
LwpSelect.delayq.tail = 0;
LwpSelect.proc = proc;
}
void lwpSleepFd(fd, mask)
int fd;
int mask;
void
lwpSleepFd(fd, mask)
int fd;
int mask;
{
extern struct lwpProc *LwpCurrent;
extern struct lwpProc *LwpCurrent;
lwpStatus(LwpCurrent, "sleeping on fd %d", fd);
lwpStatus(LwpCurrent, "sleeping on fd %d", fd);
if (LwpSelect.wait[fd] != 0) {
lwpStatus(LwpCurrent,
"multiple sleeps attempted on file descriptor %d", fd);
return;
}
if (mask & LWP_FD_READ)
FD_SET(fd, &LwpSelect.readmask);
if (mask & LWP_FD_WRITE)
FD_SET(fd, &LwpSelect.writemask);
if (LwpSelect.wait[fd] != 0) {
lwpStatus(LwpCurrent,
"multiple sleeps attempted on file descriptor %d", fd);
return;
}
if (mask & LWP_FD_READ)
FD_SET(fd, &LwpSelect.readmask);
if (mask & LWP_FD_WRITE)
FD_SET(fd, &LwpSelect.writemask);
LwpSelect.nfds++;
LwpSelect.nfds++;
if (LwpSelect.maxfd == 0 && LwpSelect.delayq.head == 0) {
/* select process is sleeping until first waiter arrives */
lwpStatus(LwpCurrent, "going to resched fd %d", fd);
lwpReady(LwpSelect.proc);
}
lwpStatus(LwpCurrent, "going to wait on fd %d", fd);
if (fd > LwpSelect.maxfd)
LwpSelect.maxfd = fd;
LwpSelect.wait[fd] = LwpCurrent;
LwpCurrent->fd = fd;
lwpReschedule();
if (LwpSelect.maxfd == 0 && LwpSelect.delayq.head == 0) {
/* select process is sleeping until first waiter arrives */
lwpStatus(LwpCurrent, "going to resched fd %d", fd);
lwpReady(LwpSelect.proc);
}
lwpStatus(LwpCurrent, "going to wait on fd %d", fd);
if (fd > LwpSelect.maxfd)
LwpSelect.maxfd = fd;
LwpSelect.wait[fd] = LwpCurrent;
LwpCurrent->fd = fd;
lwpReschedule();
}
void lwpWakeupFd(proc)
struct lwpProc *proc;
void
lwpWakeupFd(proc)
struct lwpProc *proc;
{
if (proc->fd < 0)
return;
if (proc->fd < 0)
return;
lwpStatus(proc, "awakening; was sleeping on fd %d", proc->fd);
FD_CLR(proc->fd, &LwpSelect.readmask);
FD_CLR(proc->fd, &LwpSelect.writemask);
LwpSelect.nfds--;
LwpSelect.wait[proc->fd] = 0;
proc->fd = -1;
lwpReady(proc);
lwpStatus(proc, "awakening; was sleeping on fd %d", proc->fd);
FD_CLR(proc->fd, &LwpSelect.readmask);
FD_CLR(proc->fd, &LwpSelect.writemask);
LwpSelect.nfds--;
LwpSelect.wait[proc->fd] = 0;
proc->fd = -1;
lwpReady(proc);
}
void lwpSleepUntil(until)
long until;
void
lwpSleepUntil(until)
long until;
{
extern struct lwpProc *LwpCurrent;
extern struct lwpProc *LwpCurrent;
lwpStatus(LwpCurrent, "sleeping for %d sec", until - time(0));
LwpCurrent->runtime = until;
if (LwpSelect.maxfd == 0 && LwpSelect.delayq.head == 0) {
/* select process is sleeping until first waiter arrives */
lwpReady(LwpSelect.proc);
}
lwpAddTail(&LwpSelect.delayq, LwpCurrent);
lwpReschedule();
lwpStatus(LwpCurrent, "sleeping for %d sec", until - time(0));
LwpCurrent->runtime = until;
if (LwpSelect.maxfd == 0 && LwpSelect.delayq.head == 0) {
/* select process is sleeping until first waiter arrives */
lwpReady(LwpSelect.proc);
}
lwpAddTail(&LwpSelect.delayq, LwpCurrent);
lwpReschedule();
}
/*ARGSUSED*/
void
lwpSelect(argc, argv)
int argc;
char **argv;
int argc;
char **argv;
{
extern struct lwpProc *LwpCurrent;
struct lwpProc *us = LwpCurrent;
fd_set readmask;
fd_set writemask;
int n;
int fd;
time_t now;
time_t delta;
struct lwpProc *proc;
struct timeval tv;
struct lwpQueue save;
extern struct lwpProc *LwpCurrent;
struct lwpProc *us = LwpCurrent;
fd_set readmask;
fd_set writemask;
int n;
int fd;
time_t now;
time_t delta;
struct lwpProc *proc;
struct timeval tv;
struct lwpQueue save;
lwpStatus(us, "starting select loop");
FD_ZERO(&readmask);
FD_ZERO(&writemask);
lwpStatus(us, "starting select loop");
FD_ZERO(&readmask);
FD_ZERO(&writemask);
while (1) {
while (1) {
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.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);
}
}
LwpSelect.delayq = save;
}
if (n > 0) {
/* file descriptor activity */
for(fd = 0; fd <= LwpSelect.maxfd; fd++) {
if (LwpSelect.wait[fd] == 0)
continue;
if (FD_ISSET(fd, &readmask)) {
lwpStatus(LwpSelect.wait[fd],
"input ready");
lwpWakeupFd(LwpSelect.wait[fd]);
continue;
}
if (FD_ISSET(fd, &writemask)) {
lwpStatus(LwpSelect.wait[fd],
"output ready");
lwpWakeupFd(LwpSelect.wait[fd]);
continue;
}
}
}
lwpStatus(us, "fd dispatch completed");
lwpReady(LwpCurrent);
lwpReschedule();
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();
}
/*NOTREACHED*/
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);
}
}
LwpSelect.delayq = save;
}
if (n > 0) {
/* file descriptor activity */
for (fd = 0; fd <= LwpSelect.maxfd; fd++) {
if (LwpSelect.wait[fd] == 0)
continue;
if (FD_ISSET(fd, &readmask)) {
lwpStatus(LwpSelect.wait[fd], "input ready");
lwpWakeupFd(LwpSelect.wait[fd]);
continue;
}
if (FD_ISSET(fd, &writemask)) {
lwpStatus(LwpSelect.wait[fd], "output ready");
lwpWakeupFd(LwpSelect.wait[fd]);
continue;
}
}
}
lwpStatus(us, "fd dispatch completed");
lwpReady(LwpCurrent);
lwpReschedule();
}
/*NOTREACHED*/
}
#endif