//PAGEBREAK: 36 // Print a process listing to console. For debugging. // Runs when user types ^P on console. // No lock to avoid wedging a stuck machine further. void procdump(void) { static char *states[] = { [UNUSED] "unused", [EMBRYO] "embryo", [SLEEPING] "sleep ", [RUNNABLE] "runble", [RUNNING] "run ", [ZOMBIE] "zombie" }; int i; struct proc *p; char *state; uint pc[10]; for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){ if(p->state == UNUSED) continue; if(p->state >= 0 && p->state < NELEM(states) && states[p->state]) state = states[p->state]; else state = "???"; cprintf("%d %s %s", p->pid, state, p->name); if(p->state == SLEEPING){ getcallerpcs((uint*)p->context->ebp+2, pc); for(i=0; i<10 && pc[i] != 0; i++) cprintf(" %p", pc[i]); } cprintf("\n"); } }
//PAGEBREAK: 36 // Print a process listing to console. For debugging. // Runs when user types ^P on console. // No lock to avoid wedging a stuck machine further. void procdump(void) { static char *states[] = { [UNUSED] "unused", [EMBRYO] "embryo", [SLEEPING] "sleep ", [RUNNABLE] "runble", [RUNNING] "run ", [ZOMBIE] "zombie" }; int i; struct proc *p; char *state; uint pc[10]; for(p = ptable.proc; p < &ptable.proc[NPROC]; p++) { if(p->state == UNUSED) continue; if(p->state >= 0 && p->state < NELEM(states) && states[p->state]) state = states[p->state]; else state = "???"; cprintf("pid:%d uid:%d gid:%d st:%s nm:%s pri:%d", p->pid, p->uid, p->gid, state, p->name, p->pri); if(p->state == SLEEPING){ getcallerpcs((uint*)p->context->ebp+2, pc); for(i=0; i<10 && pc[i] != 0; i++) cprintf(" %p", pc[i]); } cprintf("\n"); } #ifdef USE_CS333_SCHEDULER // Get free and ready list sizes (Debugging) /* int count = 0; p = ptable.pFreeList; while (p != 0) { count++; p = p->next; } cprintf("Size of free list: %d\n", count); for (i=0; i<N_PRI; i++) { count = 0; p = ptable.pPriQ[i]; while (p != 0) { count++; p = p->next; } cprintf("Size of priority Q %d: %d\n", i, count); } cprintf("Time to reset: %d\n", ptable.timeToReset);*/ #endif }
void panic(char *s) { int i; uint pcs[10]; cli(); cons.locking = 0; cprintf("cpu%d: panic: ", cpu->id); cprintf(s); cprintf("\n"); getcallerpcs(&s, pcs); for (i = 0; i < 10; i++) cprintf(" %p", pcs[i]); panicked = 1; // freeze other CPU for (;;) ; }
// Acquire the lock. // Loops (spins) until the lock is acquired. // Holding a lock for a long time may cause // other CPUs to waste time spinning to acquire it. void acquire(struct spinlock *lk) { pushcli(); // disable interrupts to avoid deadlock. if(holding(lk)) panic("acquire"); // The xchg is atomic. // It also serializes, so that reads after acquire are not // reordered before it. while(xchg(&lk->locked, 1) != 0) ; // Record info about lock acquisition for debugging. lk->cpu = cpu; getcallerpcs(&lk, lk->pcs); }
void panic(char *s) { int i; uint pcs[10]; __asm __volatile("cli"); use_console_lock = 0; cprintf("cpu%d: panic: ", cpu()); cprintf(s); cprintf("\n"); getcallerpcs(&s, pcs); for(i=0; i<10; i++) cprintf(" %p", pcs[i]); panicked = 1; // freeze other CPU for(;;) ; }
void panic(char *s) { int i; uint pcs[10]; cli(); cons.locking = 0; // use lapiccpunum so that we can call panic from mycpu() cprintf("lapicid %d: panic: ", lapicid()); cprintf(s); cprintf("\n"); getcallerpcs(&s, pcs); for(i=0; i<10; i++) cprintf(" %p", pcs[i]); panicked = 1; // freeze other CPU for(;;) ; }
// Acquire the lock. // Loops (spins) until the lock is acquired. // Holding a lock for a long time may cause // other CPUs to waste time spinning to acquire it. void acquire(struct spinlock *lock) { pushcli(); if(holding(lock)) panic("acquire"); // The xchg is atomic. // It also serializes, so that reads after acquire are not // reordered before it. while(xchg(&lock->locked, 1) == 1) ; // Record info about lock acquisition for debugging. // The +10 is only so that we can tell the difference // between forgetting to initialize lock->cpu // and holding a lock on cpu 0. lock->cpu = cpu() + 10; getcallerpcs(&lock, lock->pcs); }
//PAGEBREAK: 36 // Print a process listing to console. For debugging. // Runs when user types ^P on console. // No lock to avoid wedging a stuck machine further. void procdump(void) { int i; struct proc *p; char *state; uint pc[10]; for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){ if(p->state == UNUSED) continue; if(p->state >= 0 && p->state < NELEM(states) && states[p->state]) state = states[p->state]; else state = "???"; #ifndef SELECTION_NONE print_proc_data(p, state); #else cprintf("%d %s %s", p->pid, state, p->name); #endif if(p->state == SLEEPING){ getcallerpcs((uint*)p->context->ebp+2, pc); for(i=0; i<10 && pc[i] != 0; i++) cprintf(" %p", pc[i]); } cprintf("\n"); } #ifndef SELECTION_NONE uint currently_free = get_freepages_num(); if (currently_free == 0) currently_free = 1; uint precentage = ((float)currently_free / (float)free_pages_after_kernel) * 100; cprintf("%d%% free pages in the system\n", precentage); #endif }
// Acquire the lock. // Loops (spins) until the lock is acquired. // (Because contention is handled by spinning, must not // go to sleep holding any locks.) void acquire(struct spinlock *lock) { if(holding(lock)) panic("acquire"); if(cpus[cpu()].nlock == 0) cli(); cpus[cpu()].nlock++; while(cmpxchg(0, 1, &lock->locked) == 1) ; // Serialize instructions: now that lock is acquired, make sure // we wait for all pending writes from other processors. cpuid(0, 0, 0, 0, 0); // memory barrier (see Ch 7, IA-32 manual vol 3) // Record info about lock acquisition for debugging. // The +10 is only so that we can tell the difference // between forgetting to initialize lock->cpu // and holding a lock on cpu 0. lock->cpu = cpu() + 10; getcallerpcs(&lock, lock->pcs); }
// Print a process listing to console. For debugging. // Runs when user types ^P on console. // No lock to avoid wedging a stuck machine further. void procdump(void) { static char *states[] = { [UNUSED] "unused", [EMBRYO] "embryo", [SLEEPING] "sleep ", [RUNNABLE] "runble", [RUNNING] "run ", [ZOMBIE] "zombie" }; int i, j; struct proc *p; char *state; uint pc[10]; for(i = 0; i < NPROC; i++){ p = &proc[i]; if(p->state == UNUSED) continue; if(p->state >= 0 && p->state < NELEM(states) && states[p->state]) state = states[p->state]; else state = "???"; cprintf("%d %s %s", p->pid, state, p->name); if(p->state == SLEEPING){ getcallerpcs((uint*)p->context.ebp+2, pc); for(j=0; j<10 && pc[j] != 0; j++) cprintf(" %p", pc[j]); } #ifdef LOTTERY cprintf(" %d", p->tickets); #endif cprintf("\n"); } }