www.pudn.com > b048008.rar > Alarm.cc


#include "copyright.h" 
#include "Alarm.h" 
#include "system.h" 
 
 
void loopwhile(int which) 
{ 
    while(alarmclock->Getpausenum()!=0) 
    { 
        currentThread->Yield(); 
    } 
    currentThread->Finish(); 
} 
Alarm::Alarm(char *debugName) 
{ 
    name = debugName; 
    pausenum = 0; 
    alarm_queue = new List; 
} 
void 
Alarm::Pause(int howLong) 
{    
    pausenum ++; 
    if(pausenum ==1){ 
        Thread *t = new Thread("while yeile thread"); 
        t->Fork(loopwhile,0); 
    } 
    if(howLong <= 0)  
        return; 
    timeLeft = stats->totalTicks+howLong*TimerTicks*10000; 
    thread = currentThread; 
    alarm_queue->SortedInsert(currentThread, timeLeft); 
    IntStatus oldLevel = interrupt->SetLevel(IntOff); 
    currentThread->Sleep(); 
    (void) interrupt->SetLevel(oldLevel); 
} 
void 
Alarm::WakeUp() 
{  
    Thread* thread1; 
    int ptime=-1; 
    IntStatus oldLevel1 = interrupt->SetLevel(IntOff); 
    thread1 = (Thread*) alarm_queue->SortedRemove(&ptime); 
    (void) interrupt->SetLevel(oldLevel1); 
    while(thread1!=NULL){ 
        if(stats->totalTicks >=ptime ) 
        { 
            scheduler->ReadyToRun(thread1); 
            pausenum--; 
            IntStatus oldLevel2 = interrupt->SetLevel(IntOff); 
            thread1 = (Thread*) alarm_queue->SortedRemove(&ptime); 
            (void) interrupt->SetLevel(oldLevel2); 
 
            continue; 
        } 
        else { 
            IntStatus oldLevel3 = interrupt->SetLevel(IntOff); 
            alarm_queue->SortedInsert(thread1,ptime); 
            (void) interrupt->SetLevel(oldLevel3); 
            break; 
        } 
    } 
}