readd-qwaiting-20050121

FIXES 5616

the problem was caused by optimization on solaris. sigh.
This commit is contained in:
Derrick Brashear 2005-01-21 14:33:40 +00:00
parent 76d6e43eb8
commit 9011551120

View File

@ -121,7 +121,7 @@ static purge_dead_pcbs();
struct QUEUE {
PROCESS head;
int count;
} runnable[MAX_PRIORITIES], blocked;
} runnable[MAX_PRIORITIES], blocked, qwaiting;
/* Invariant for runnable queues: The head of each queue points to the currently running process if it is in that queue, or it points to the next process in that queue that should run. */
/* Offset of stack field within pcb -- used by stack checking stuff */
@ -242,7 +242,7 @@ LWP_QWait(void)
{
register PROCESS tp;
(tp = lwp_cpptr)->status = QWAITING;
lwp_remove(tp, &runnable[tp->priority]);
move(tp, &runnable[tp->priority], &qwaiting);
Set_LWP_RC();
return LWP_SUCCESS;
}
@ -253,7 +253,7 @@ LWP_QSignal(pid)
{
if (pid->status == QWAITING) {
pid->status = READY;
insert(pid, &runnable[pid->priority]);
move(pid, &qwaiting, &runnable[pid->priority]);
return LWP_SUCCESS;
} else
return LWP_ENOWAIT;
@ -561,6 +561,9 @@ Dump_Processes(void)
for_all_elts(x, blocked, {
Dump_One_Process(x);}
)
for_all_elts(x, qwaiting, {
Dump_One_Process(x);}
)
} else
printf("***LWP: LWP support not initialized\n");
return 0;
@ -601,6 +604,8 @@ LWP_InitializeProcessSupport(int priority, PROCESS * pid)
}
blocked.head = NULL;
blocked.count = 0;
qwaiting.head = NULL;
qwaiting.count = 0;
lwp_init = (struct lwp_ctl *)malloc(sizeof(struct lwp_ctl));
temp = (PROCESS) malloc(sizeof(struct lwp_pcb));
if (lwp_init == NULL || temp == NULL)
@ -659,6 +664,9 @@ LWP_TerminateProcessSupport(void)
)
for_all_elts(cur, blocked, {
Free_PCB(cur);}
)
for_all_elts(cur, qwaiting, {
Free_PCB(cur);}
)
free(lwp_init);
lwp_init = NULL;
@ -784,7 +792,9 @@ Delete_PCB(register PROCESS pid)
lwp_remove(pid,
(pid->blockflag || pid->status == WAITING
|| pid->status ==
DESTROYED ? &blocked : &runnable[pid->priority]));
DESTROYED ? &blocked :
(pid->status == QWAITING) ? &qwaiting :
&runnable[pid->priority]));
LWPANCHOR.processcnt--;
return 0;
}
@ -811,6 +821,9 @@ Dump_One_Process(PROCESS pid)
case DESTROYED:
printf("DESTROYED");
break;
case QWAITING:
printf("QWAITING");
break;
default:
printf("unknown");
}
@ -870,7 +883,13 @@ Dispatcher(void)
printf(" \"%s\"", p->name);
}
)
puts("]");
puts("]");
printf("[Qwaiting (%d):", qwaiting.count);
for_all_elts(p, qwaiting, {
printf(" \"%s\"", p->name);
}
)
puts("]");
}
#endif