Usermode/libc++ - cxa_guard behavior fix
authorJohn Hodge (sonata) <[email protected]>
Fri, 26 Dec 2014 10:06:23 +0000 (18:06 +0800)
committerJohn Hodge (sonata) <[email protected]>
Fri, 26 Dec 2014 10:06:23 +0000 (18:06 +0800)
Usermode/Libraries/libc++.so_src/guard.cc

index a075a7b..6468a67 100644 (file)
@@ -6,24 +6,33 @@
  * - One-time construction API
  */
 #include <stdint.h>
+#include <acess/sys.h>
+#include <cstdlib>
+
+#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();
 }
 

UCC git Repository :: git.ucc.asn.au