From 178fc7050b818c6c652831973600f42deef87de1 Mon Sep 17 00:00:00 2001 From: Derrick Brashear Date: Mon, 31 Jan 2005 04:20:00 +0000 Subject: [PATCH] STABLE14-readd-qwaiting-20050121 FIXES 5616 the problem was caused by optimization on solaris. sigh. (cherry picked from commit 90115511209e59ff4728a66a575899312fdf3e5b) --- src/lwp/lwp.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/lwp/lwp.c b/src/lwp/lwp.c index 1a9a4f025..06e3e1b49 100644 --- a/src/lwp/lwp.c +++ b/src/lwp/lwp.c @@ -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 -- 2.39.5