|
|
|
|
@ -4,6 +4,7 @@
|
|
|
|
|
#include "../debug/output.h"
|
|
|
|
|
#include "../object/bbuffer.h"
|
|
|
|
|
#include "../sync/ticketlock.h"
|
|
|
|
|
#include "../arch/core_interrupt.h"
|
|
|
|
|
#include "epilogues.h"
|
|
|
|
|
|
|
|
|
|
#define FOR_CURRENT_CORE [Core::getID()]
|
|
|
|
|
@ -21,10 +22,45 @@ Vault::Vault() {}
|
|
|
|
|
|
|
|
|
|
Guarded::~Guarded() { Guard::leave(); }
|
|
|
|
|
|
|
|
|
|
Guarded Guard::enter() { while (true); }
|
|
|
|
|
Guarded Guard::enter() {
|
|
|
|
|
epi_flag FOR_CURRENT_CORE = true;
|
|
|
|
|
Core::Interrupt::enable();
|
|
|
|
|
global_lock.lock();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Guard::leave() {}
|
|
|
|
|
void Guard::leave() {
|
|
|
|
|
bool istate = Core::Interrupt::disable();
|
|
|
|
|
|
|
|
|
|
void Guard::relay(Epilogue handler) { (void)handler; }
|
|
|
|
|
Epilogue next;
|
|
|
|
|
while(epilogue_queue FOR_CURRENT_CORE.consume(next)){
|
|
|
|
|
Core::Interrupt::enable();
|
|
|
|
|
next(global_vault);
|
|
|
|
|
Core::Interrupt::disable();
|
|
|
|
|
}
|
|
|
|
|
epi_flag FOR_CURRENT_CORE = false;
|
|
|
|
|
global_lock.unlock();
|
|
|
|
|
Core::Interrupt::restore(istate);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
// handler(global_vault);
|
|
|
|
|
// leave(); // maybe not needed since destructor also calls leave
|
|
|
|
|
//}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const Vault &Guard::unsafeConstAccess() { return global_vault; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|