Browse Source

Fixed subtle gc/fiber bug.

Mark Sibly 9 years ago
parent
commit
d3c433c8a8

+ 1 - 1
modules/monkey/native/bbfunction.h

@@ -3,7 +3,7 @@
 #define BB_FUNCTION_H
 
 #include "bbtypes.h"
-#include "bbgc.h"
+//#include "bbgc.h"
 #include "bbdebug.h"
 
 template<class T> class bbFunction;

+ 2 - 0
modules/monkey/native/bbgc.cpp

@@ -142,6 +142,8 @@ namespace bbGC{
 		bbGCFiber *fiber=fibers;
 		
 		for(;;){
+		
+			bbGCMark( fiber->entry );
 
 			for( bbGCFrame *frame=fiber->frames;frame;frame=frame->succ ){
 			

+ 2 - 0
modules/monkey/native/bbgc.h

@@ -5,6 +5,7 @@
 #include "bbstd.h"
 #include "bbtypes.h"
 #include "bbmemory.h"
+#include "bbfunction.h"
 
 //how much to allocate before a sweep occurs
 //#define BBGC_TRIGGER 0
@@ -92,6 +93,7 @@ struct bbGCFiber{
 	bbGCFrame *frames;
 	bbGCNode *ctoring;
 	bbGCTmp *tmps;
+	bbFunction<void()> entry;
 	
 	bbGCFiber():succ( this ),pred( this ),frames( nullptr ),ctoring( nullptr ),tmps( nullptr ){
 	}

+ 30 - 15
modules/std/fiber/native/fiber.cpp

@@ -19,10 +19,9 @@ namespace bbFiber{
 		int id;
 				
 		unsigned char *stack;
-		bbGCFiber *gcFiber;
 		bbDBContext *dbContext;
+		bbGCFiber *gcFiber;
 		
-		Entry entry;
 		fcontext_t fcontext;
 		fcontext_t fcontext2;
 	};
@@ -130,7 +129,7 @@ namespace bbFiber{
 		
 		setCurrFiber( fiber );
 		
-		fiber->entry();
+		fiber->gcFiber->entry();
 		
 		fiber->gcFiber->unlink();
 		
@@ -139,23 +138,48 @@ namespace bbFiber{
 	
 	// ***** API *****
 
+	// Currently unsafe!
+	//
+	// gcFiber->entry will not be gc_marked until fiber is running...
+	//
 	int createFiber( Entry entry ){
 	
 		Fiber *fiber=allocFiber();
 		if( !fiber ) return 0;
 		
-		fiber->entry=entry;
+		fiber->gcFiber->entry=entry;
 		fiber->fcontext=make_fcontext( fiber->stack+STACK_SIZE,STACK_SIZE,fiberEntry );
 		
 		return fiber->id;
 	}
 	
+	// Safe!
+	//
+	int startFiber( Entry entry ){
+
+		Fiber *fiber=allocFiber();
+		if( !fiber ) return 0;
+
+		int id=fiber->id;
+		
+		fiber->gcFiber->entry=entry;
+		fiber->fcontext=make_fcontext( fiber->stack+STACK_SIZE,STACK_SIZE,fiberEntry );
+		
+		Fiber *curr=currFiber;
+
+		fiber->fcontext=jump_fcontext( fiber->fcontext,fiber ).fcontext;
+
+		setCurrFiber( curr );
+		
+		return id;
+	}
+	
 	void resumeFiber( int id ){
 	
 		Fiber *fiber=getFiber( id );
 		if( !fiber ){
 			//
-			// could signal a semaphore...
+			// could signal a semaphore...?
 			//
 			bbDB::error( "Invalid fiber id" );
 			return;
@@ -172,7 +196,7 @@ namespace bbFiber{
 	
 		if( currFiber==mainFiber ){
 			//
-			// could wait on a semaphore...
+			// could wait on a semaphore...?
 			//
 			bbDB::error( "Can't suspend main fiber" );
 			return;
@@ -206,15 +230,6 @@ namespace bbFiber{
 		suspendCurrentFiber();
 	}
 	
-	int startFiber( bbFunction<void()> entry ){
-	
-		int id=createFiber( entry );
-		
-		if( id ) resumeFiber( id );
-		
-		return id;
-	}
-	
 	void terminateFiber( int id ){
 
 	}