plan 9 kernel history: overview | file list | diff list

2002/0503/port/edf.c (diff list | history)

2002/0420/sys/src/9/port/edf.c:252,2572002/0503/sys/src/9/port/edf.c:252,258 (short | long | prev | next)
2002/0410    
deadline(Proc *p, SEvent why) 
2002/0315    
{ 
	Task *t, *nt; 
2002/0503    
	Ticks used; 
2002/0315    
 
	/* Task has reached its deadline, lock must be held */ 
2002/0410    
	DPRINT("%d deadline, %s, %d\n", m->machno, edfstatename[p->task->state], p->task->runq.n); 
2002/0420/sys/src/9/port/edf.c:272,2772002/0503/sys/src/9/port/edf.c:273,283
2002/0410    
		timerdel(&deadlinetimer[m->machno]); 
		deadlinetimer[m->machno].when = 0; 
2002/0327    
	} 
2002/0503    
	used = now - t->scheduled; 
	t->S -= used; 
	t->scheduled = now; 
	t->total += used; 
	t->aged = (t->aged*31 + t->C - t->S) >> 5; 
2002/0315    
	t->d = now; 
	t->state = EdfDeadline; 
2002/0316    
	if(devrt) devrt(t, now, why); 
2002/0420/sys/src/9/port/edf.c:330,3352002/0503/sys/src/9/port/edf.c:336,342
2002/0315    
		t->S = t->C; 
		t->scheduled = now; 
		t->state = EdfRunning; 
2002/0503    
		t->periods++; 
2002/0316    
		if(devrt) devrt(t, now, SRun); 
2002/0320    
		setdelta(); 
2002/0315    
		assert(t->runq.n > 0 || (up && up->task == t)); 
2002/0420/sys/src/9/port/edf.c:457,4622002/0503/sys/src/9/port/edf.c:464,470
2002/0315    
	 
		used = now - t->scheduled; 
		t->scheduled = now; 
2002/0503    
		t->total += used; 
2002/0315    
 
		if (t->r < now){ 
			if (t->S <= used) 
2002/0420/sys/src/9/port/edf.c:466,4732002/0503/sys/src/9/port/edf.c:474,483
2002/0315    
	 
			if (t->d <= now || t->S == 0LL){ 
				/* Task has reached its deadline/slice, remove from queue */ 
2002/0420    
				if (t->S > 0LL) 
2002/0503    
				if (t->d <= now){ 
					t->missed++; 
2002/0420    
					misseddeadlines++; 
2002/0503    
				} 
2002/0410    
				deadline(up, SSlice); 
2002/0315    
				while (t = edfstack[m->machno].head){ 
					if (now < t->d) 
2002/0420/sys/src/9/port/edf.c:728,7362002/0503/sys/src/9/port/edf.c:738,746
2002/0315    
		edfdequeue(&qreleased); 
		assert(nt->runq.n >= 1); 
		edfpush(nt); 
		nt->state = EdfRunning; 
		t = nt; 
		t->scheduled = now; 
2002/0503    
		t->periods++; 
2002/0315    
	}else{ 
2002/0410    
		DPRINT("%d edfrunproc: current\n", m->machno); 
2002/0315    
	} 
2002/0420/sys/src/9/port/edf.c:741,7462002/0503/sys/src/9/port/edf.c:751,757
2002/0315    
	 * No need to lock runq, edflock always held to access runq 
	 */ 
	t->state = EdfRunning; 
2002/0503    
	t->periods++; 
2002/0315    
	p = t->runq.head; 
	if ((t->runq.head = p->rnext) == nil) 
		t->runq.tail = nil; 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)