Browse Source

WIP threads.

Mark Sibly 7 years ago
parent
commit
5f4b23c77b
2 changed files with 27 additions and 7 deletions
  1. 17 7
      modules/monkey/native/bbdebug.cpp
  2. 10 0
      modules/monkey/native/bbgc_mx.cpp

+ 17 - 7
modules/monkey/native/bbdebug.cpp

@@ -18,6 +18,7 @@ typedef void(*dbEmit_t)(void*);
 
 
 #if BB_THREADS
 #if BB_THREADS
 namespace bbGC{
 namespace bbGC{
+	extern const char *state;
 	void suspendThreads();
 	void suspendThreads();
 	void resumeThreads();
 	void resumeThreads();
 }
 }
@@ -25,8 +26,6 @@ namespace bbGC{
 
 
 namespace bbDB{
 namespace bbDB{
 
 
-	bool fatality;
-	
 #if BB_THREADS	
 #if BB_THREADS	
 	std::atomic_int nextSeq;
 	std::atomic_int nextSeq;
 	thread_local bbDBContext *currentContext;
 	thread_local bbDBContext *currentContext;
@@ -59,9 +58,21 @@ namespace bbDB{
 #endif	
 #endif	
 		}
 		}
 		
 		
-		fatality=true;
-		error( err );
-		exit( 0 );
+		char buf[160];
+#ifdef BB_THREADS		
+		sprintf( buf,"Monkey 2 Runtime error: %s\nGC state=%s\n",err,bbGC::state );
+#else
+		sprintf( buf,"Monkey 2 Runtime error: %s\n",err );
+#endif
+		bb_printf( buf );
+
+#ifdef NDEBUG
+#ifdef _WIN32
+ 		MessageBoxA( 0,buf,"Monkey 2 Runtime Error",MB_OK );
+#endif
+		exit( -1 );
+#endif
+		stopped();
 	}
 	}
 	
 	
 	void init(){
 	void init(){
@@ -166,8 +177,7 @@ namespace bbDB{
 		
 		
 			char buf[256];
 			char buf[256];
 			char *e=fgets( buf,256,stdin );
 			char *e=fgets( buf,256,stdin );
-			
-			if( !e || fatality ) exit( -1 );
+			if( !e ) exit( -1 );
 			
 			
 #ifdef BB_THREADS
 #ifdef BB_THREADS
 			bbGC::resumeThreads();
 			bbGC::resumeThreads();

+ 10 - 0
modules/monkey/native/bbgc_mx.cpp

@@ -42,6 +42,8 @@ namespace{
 
 
 namespace bbGC{
 namespace bbGC{
 
 
+	const char *state="IDLE";
+
 	size_t trigger=4*1024*1024;
 	size_t trigger=4*1024*1024;
 	int suspended=1;
 	int suspended=1;
 	
 	
@@ -487,15 +489,23 @@ namespace bbGC{
 
 
 			if( allocedBytes+size>=trigger ){
 			if( allocedBytes+size>=trigger ){
 				
 				
+				state="SWEEPING";
+				
 				sweep();
 				sweep();
 				
 				
 			}else{
 			}else{
 			
 			
+				state="MARKING";
+			
 				markQueued( double( allocedBytes+size ) / double( trigger ) * double( unmarkedBytes + trigger ) );
 				markQueued( double( allocedBytes+size ) / double( trigger ) * double( unmarkedBytes + trigger ) );
 			}
 			}
 			
 			
+			state="RECLAIMING";			
+			
 			reclaim( size );
 			reclaim( size );
 			
 			
+			state="IDLE";
+			
 			unlockCollector();
 			unlockCollector();
 		}
 		}