Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 307 → Rev 309

/SPARTAN/trunk/src/proc/scheduler.c
60,10 → 60,42
*/
void before_thread_runs(void)
{
before_thread_runs_arch();
fpu_context_restore(&(THREAD->saved_fpu_context));
before_thread_runs_arch();
#ifdef FPU_LAZY
if(THREAD==CPU->fpu_owner)
fpu_enable();
else
fpu_disable();
#else
fpu_enable();
if (THREAD->fpu_context_exists)
fpu_context_restore(&(THREAD->saved_fpu_context));
else {
fpu_init();
THREAD->fpu_context_exists=1;
}
#endif
}
 
#ifdef FPU_LAZY
void scheduler_fpu_lazy_request(void)
{
fpu_enable();
if (CPU->fpu_owner != NULL) {
fpu_context_save(&CPU->fpu_owner->saved_fpu_context);
/* don't prevent migration */
CPU->fpu_owner->fpu_context_engaged=0;
}
if (THREAD->fpu_context_exists)
fpu_context_restore(&THREAD->saved_fpu_context);
else {
fpu_init();
THREAD->fpu_context_exists=1;
}
CPU->fpu_owner=THREAD;
THREAD->fpu_context_engaged = 1;
}
#endif
 
/** Initialize scheduler
*
240,7 → 272,9
 
if (THREAD) {
spinlock_lock(&THREAD->lock);
#ifndef FPU_LAZY
fpu_context_save(&(THREAD->saved_fpu_context));
#endif
if (!context_save(&THREAD->saved_context)) {
/*
* This is the place where threads leave scheduler();