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

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

2002/0319/sys/src/9/port/edf.c:72,792002/0320/sys/src/9/port/edf.c:72,79 (short | long | prev | next)
2002/0315    
 
static void		edf_intr(Ureg*, Cycintr*); 
static void		edf_resched(Task *t); 
static void		setΔ(void); 
static void		testΔ(Task *thetask); 
2002/0320    
static void		setdelta(void); 
static void		testdelta(Task *thetask); 
2002/0315    
static char *	edf_testschedulability(Task *thetask); 
static void		edf_setclock(void); 
 
2002/0319/sys/src/9/port/edf.c:226,2352002/0320/sys/src/9/port/edf.c:226,239
2002/0315    
	/* The current proc has blocked */ 
	ilock(&edflock); 
	t = p->task; 
2002/0320    
	assert(t); 
	if (t->state != EdfRunning){ 
		/* called by a proc just joining the task */ 
		iunlock(&edflock); 
		return; 
	} 
2002/0316    
	DENTER("%.*s%d edf_block, %s, %d\n", ind, tabs, m->machno, edf_statename[t->state], t->runq.n); 
2002/0315    
 
	assert(t); 
	assert(t->state == EdfRunning); 
	if (t->runq.n){ 
		/* There's another runnable proc in the running task, leave task where it is */ 
		iunlock(&edflock); 
2002/0319/sys/src/9/port/edf.c:255,2662002/0320/sys/src/9/port/edf.c:259,269
2002/0315    
	if (p){ 
		nt = p->task; 
		assert(nt); 
		assert(nt->state == EdfRunning); 
	} 
	t = edfpop(); 
 
	if(p != nil && nt != t){ 
2002/0316    
		DPRINT("%.*s%d edfdeadline, %s, %d\n", ind, tabs, m->machno, edf_statename[p->task->state], p->task->runq.n); 
2002/0320    
		iprint("edfdeadline, %s, %d\n", edf_statename[p->task->state], p->task->runq.n); 
2002/0315    
		iunlock(&edflock); 
		assert(0 && p == nil || nt == t); 
	} 
2002/0319/sys/src/9/port/edf.c:326,3322002/0320/sys/src/9/port/edf.c:329,335
2002/0315    
		t->scheduled = now; 
		t->state = EdfRunning; 
2002/0316    
		if(devrt) devrt(t, now, SRun); 
2002/0315    
		setΔ(); 
2002/0320    
		setdelta(); 
2002/0315    
		assert(t->runq.n > 0 || (up && up->task == t)); 
		edfpush(t); 
		edf_setclock(); 
2002/0319/sys/src/9/port/edf.c:336,3422002/0320/sys/src/9/port/edf.c:339,345
2002/0315    
				t->state = EdfAdmitted; 
				t->r = now; 
				edf_release(t); 
				setΔ(); 
2002/0320    
				setdelta(); 
2002/0315    
				edf_resched(t); 
			}else{ 
				edfenqueue(&qadmit, t); 
2002/0319/sys/src/9/port/edf.c:393,3992002/0320/sys/src/9/port/edf.c:396,402
2002/0315    
	} 
	t->state = EdfExpelled; 
2002/0316    
	if(devrt) devrt(t, now, SExpel); 
2002/0315    
	setΔ(); 
2002/0320    
	setdelta(); 
2002/0315    
	DLEAVE; 
	iunlock(&edflock); 
	qunlock(&edfschedlock); 
2002/0319/sys/src/9/port/edf.c:739,7452002/0320/sys/src/9/port/edf.c:742,748
2002/0315    
		return nil; 
	} 
	DENTER("edf_runproc %lud\n", nilcount); 
	if (nt && (t == nil || (nt->D < t->Δ && nt->d < t->d))){ 
2002/0320    
	if (nt && (t == nil || (nt->d < t->d && nt->D < t->Delta))){ 
2002/0315    
		/* released task is better than current */ 
2002/0316    
		DPRINT("%.*s%d edf_runproc: released\n", ind, tabs, m->machno); 
2002/0315    
		edfdequeue(&qreleased); 
2002/0319/sys/src/9/port/edf.c:777,7842002/0320/sys/src/9/port/edf.c:780,785
2002/0315    
int 
edf_waitlock(Lock *l) 
{ 
2002/0319    
	Task *t; 
                 
2002/0315    
	iprint("edf_waitlock\n"); 
	ilock(&waitlock);	/* can't afford normal locks here */ 
	if (l->key == 0){ 
2002/0319/sys/src/9/port/edf.c:820,8262002/0320/sys/src/9/port/edf.c:821,827
2002/0315    
/* Schedulability testing and its supporting routines */ 
 
static void 
setΔ(void) 
2002/0320    
setdelta(void) 
2002/0315    
{ 
	Resource *r, **rr; 
	Task **tt, *t; 
2002/0319/sys/src/9/port/edf.c:828,8502002/0320/sys/src/9/port/edf.c:829,851
2002/0315    
	for (r = resources; r < resources + nelem(resources); r++){ 
		if (r->name == nil) 
			continue; 
		r->Δ = ~0LL; 
2002/0320    
		r->Delta = ~0LL; 
2002/0315    
		for (tt = r->tasks; tt < r->tasks + nelem(r->tasks); tt++) 
			if (*tt && (*tt)->D < r->Δ) 
				r->Δ = (*tt)->D; 
2002/0320    
			if (*tt && (*tt)->D < r->Delta) 
				r->Delta = (*tt)->D; 
2002/0315    
	} 
	for (t = tasks; t < tasks + nelem(tasks); t++){ 
		if (t->state < EdfIdle) 
			continue; 
		t->Δ = t->D; 
2002/0320    
		t->Delta = t->D; 
2002/0315    
		for (rr = t->res; rr < t->res + nelem(t->res); rr++) 
			if (*rr && (*rr)->Δ < t->Δ) 
				t->Δ = (*rr)->Δ; 
2002/0320    
			if (*rr && (*rr)->Delta < t->Delta) 
				t->Delta = (*rr)->Delta; 
2002/0315    
	} 
} 
 
static void 
testΔ(Task *thetask) 
2002/0320    
testdelta(Task *thetask) 
2002/0315    
{ 
	Resource *r, **rr; 
	Task **tt, *t; 
2002/0319/sys/src/9/port/edf.c:852,8692002/0320/sys/src/9/port/edf.c:853,870
2002/0315    
	for (r = resources; r < resources + nelem(resources); r++){ 
		if (r->name == nil) 
			continue; 
		r->testΔ = ~0ULL; 
2002/0320    
		r->testDelta = ~0ULL; 
2002/0315    
		for (tt = r->tasks; tt < r->tasks + nelem(r->tasks); tt++) 
			if (*tt && (*tt)->D < r->testΔ) 
				r->testΔ = (*tt)->D; 
2002/0320    
			if (*tt && (*tt)->D < r->testDelta) 
				r->testDelta = (*tt)->D; 
2002/0315    
	} 
	for (t = tasks; t < tasks + nelem(tasks); t++){ 
		if (t->state <= EdfExpelled && t != thetask) 
			continue; 
		t->testΔ = t->D; 
2002/0320    
		t->testDelta = t->D; 
2002/0315    
		for (rr = t->res; rr < t->res + nelem(t->res); rr++) 
			if (*rr && (*rr)->testΔ < t->testΔ) 
				t->testΔ = (*rr)->testΔ; 
2002/0320    
			if (*rr && (*rr)->testDelta < t->testDelta) 
				t->testDelta = (*rr)->testDelta; 
2002/0315    
	} 
} 
 
2002/0319/sys/src/9/port/edf.c:877,8832002/0320/sys/src/9/port/edf.c:878,884
2002/0315    
	for (t = tasks; t < tasks + Maxtasks; t++){ 
		if (t->state <= EdfExpelled && t != thetask) 
			continue; 
		if (t->testΔ <= ticks && ticks < t->D && Cb < t->C) 
2002/0320    
		if (t->testDelta <= ticks && ticks < t->D && Cb < t->C) 
2002/0315    
			Cb = t->C; 
	} 
	return Cb; 
2002/0319/sys/src/9/port/edf.c:917,9232002/0320/sys/src/9/port/edf.c:918,924
2002/0315    
	int steps; 
 
	/* initialize */ 
	testΔ(thetask); 
2002/0320    
	testdelta(thetask); 
2002/0315    
	if (thetask && (thetask->flags & Verbose)) 
		pprint("schedulability test\n"); 
	qschedulability = nil; 
2002/0319/sys/src/9/port/edf.c:986,9912002/0320/sys/src/9/port/edf.c:987,994
2002/0315    
ticks2time(Ticks ticks) 
{ 
	assert(ticks >= 0); 
2002/0320    
	if (fasthz == 0) 
		fastticks(&fasthz); 
2002/0315    
	return uvmuldiv(ticks, Onesecond, fasthz); 
} 
 


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