X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibc%2B%2B.so_src%2Fguard.cc;h=6468a676300fdcae4736960f4047cff55e1f1b81;hb=ba78deafcc3016555469ed263d7a0370fa99db4b;hp=a075a7b610830dc087f49ad5643f534562e3ad4f;hpb=515d24f4080529f45fc94c4522f2a0da3fe98148;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libc++.so_src/guard.cc b/Usermode/Libraries/libc++.so_src/guard.cc index a075a7b6..6468a676 100644 --- a/Usermode/Libraries/libc++.so_src/guard.cc +++ b/Usermode/Libraries/libc++.so_src/guard.cc @@ -6,24 +6,33 @@ * - One-time construction API */ #include +#include +#include + +#define FLAG_INIT_COMPLETE (1<<0) +#define FLAG_INIT_LOCKED (1<<1) extern "C" int __cxa_guard_acquire ( int64_t *guard_object ) { // TODO: Mutex! - if( *guard_object ) - return 1; - *guard_object = 1; - return 0; + if( *guard_object == FLAG_INIT_COMPLETE ) + return 0; + if( *guard_object == FLAG_INIT_LOCKED ) { + _SysDebug("ERROR: __cxa_guard_acquire - nested"); + } + *guard_object = FLAG_INIT_LOCKED; + return 1; } extern "C" void __cxa_guard_release ( int64_t *guard_object ) { - *guard_object = 0; + *guard_object = FLAG_INIT_COMPLETE; } extern "C" void __cxa_guard_abort ( int64_t *guard_object ) { - *guard_object = 0; - // TODO: abort + *guard_object = FLAG_INIT_COMPLETE; + _SysDebug("__cxa_guard_abort"); + abort(); }