|
|
|
@ -25,7 +25,7 @@ Guarded::~Guarded() { Guard::leave(); }
|
|
|
|
|
|
|
|
|
|
|
|
Guarded Guard::enter() {
|
|
|
|
Guarded Guard::enter() {
|
|
|
|
epi_flag FOR_CURRENT_CORE = true;
|
|
|
|
epi_flag FOR_CURRENT_CORE = true;
|
|
|
|
Core::Interrupt::enable();
|
|
|
|
//Core::Interrupt::enable();
|
|
|
|
global_lock.lock();
|
|
|
|
global_lock.lock();
|
|
|
|
return Guarded(global_vault);
|
|
|
|
return Guarded(global_vault);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -34,16 +34,17 @@ void Guard::leave() {
|
|
|
|
bool istate = Core::Interrupt::disable();
|
|
|
|
bool istate = Core::Interrupt::disable();
|
|
|
|
|
|
|
|
|
|
|
|
Epilogue next;
|
|
|
|
Epilogue next;
|
|
|
|
|
|
|
|
global_lock.unlock();
|
|
|
|
while(epilogue_queue FOR_CURRENT_CORE.consume(next)){
|
|
|
|
while(epilogue_queue FOR_CURRENT_CORE.consume(next)){
|
|
|
|
Core::Interrupt::enable();
|
|
|
|
Core::Interrupt::enable();
|
|
|
|
|
|
|
|
global_lock.lock();
|
|
|
|
next(global_vault);
|
|
|
|
next(global_vault);
|
|
|
|
|
|
|
|
global_lock.unlock();
|
|
|
|
Core::Interrupt::disable();
|
|
|
|
Core::Interrupt::disable();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
epi_flag FOR_CURRENT_CORE = false;
|
|
|
|
epi_flag FOR_CURRENT_CORE = false;
|
|
|
|
global_lock.unlock();
|
|
|
|
|
|
|
|
Core::Interrupt::restore(istate);
|
|
|
|
Core::Interrupt::restore(istate);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Guard::relay(Epilogue handler) {
|
|
|
|
void Guard::relay(Epilogue handler) {
|
|
|
|
//if(!epilogue_queue FOR_CURRENT_CORE.produce(handler))
|
|
|
|
//if(!epilogue_queue FOR_CURRENT_CORE.produce(handler))
|
|
|
|
// return; // enqueue, but dont execute
|
|
|
|
// return; // enqueue, but dont execute
|
|
|
|
@ -62,9 +63,9 @@ void Guard::relay(Epilogue handler) {
|
|
|
|
epi_flag FOR_CURRENT_CORE = true;
|
|
|
|
epi_flag FOR_CURRENT_CORE = true;
|
|
|
|
global_lock.lock();
|
|
|
|
global_lock.lock();
|
|
|
|
handler(global_vault);
|
|
|
|
handler(global_vault);
|
|
|
|
global_lock.unlock();
|
|
|
|
leave();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
epilogue_queue->consume(handler);
|
|
|
|
//epilogue_queue->consume(handler);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|