|
|
|
|
@ -44,22 +44,23 @@ void Guard::leave() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Guard::relay(Epilogue handler) {
|
|
|
|
|
if(!epilogue_queue FOR_CURRENT_CORE.consume(handler))
|
|
|
|
|
return; // enqueue, but dont execute
|
|
|
|
|
if(epi_flag FOR_CURRENT_CORE){
|
|
|
|
|
enter();
|
|
|
|
|
Core::Interrupt::disable();
|
|
|
|
|
leave();
|
|
|
|
|
}
|
|
|
|
|
//Core::Interrupt::enable(); // goto level 0.5
|
|
|
|
|
//if(epi_flag FOR_CURRENT_CORE){
|
|
|
|
|
// epilogue_queue->produce(handler);
|
|
|
|
|
//}
|
|
|
|
|
//else{
|
|
|
|
|
// epi_flag FOR_CURRENT_CORE = true;
|
|
|
|
|
//if(!epilogue_queue FOR_CURRENT_CORE.produce(handler))
|
|
|
|
|
// return; // enqueue, but dont execute
|
|
|
|
|
//if(!epi_flag FOR_CURRENT_CORE){
|
|
|
|
|
// enter();
|
|
|
|
|
// Core::Interrupt::enable();
|
|
|
|
|
// handler(global_vault);
|
|
|
|
|
// leave(); // maybe not needed since destructor also calls leave
|
|
|
|
|
// leave();
|
|
|
|
|
//}
|
|
|
|
|
Core::Interrupt::enable(); // goto level 0.5
|
|
|
|
|
if(epi_flag FOR_CURRENT_CORE){
|
|
|
|
|
epilogue_queue->produce(handler);
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
epi_flag FOR_CURRENT_CORE = true;
|
|
|
|
|
handler(global_vault);
|
|
|
|
|
leave(); // maybe not needed since destructor also calls leave
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const Vault &Guard::unsafeConstAccess() { return global_vault; }
|
|
|
|
|
|