Browse Source

Nuked old std/_dev dir.

Mark Sibly 9 years ago
parent
commit
8788dadc41

+ 0 - 100
modules/std/_dev/fiber.monkey2

@@ -1,100 +0,0 @@
-
-Namespace std.fiber
-
-#Import "native/fiber.h"
-#Import "native/fiber.cpp"
-
-Extern
-
-#rem monkeydoc
-
-Starts a new running fiber.
-
-This is the same as using `CreateFiber` followed by `ResumeFiber`.
-
-@return a new fiber handle.
-
-#end
-Function StartFiber:Int( entry:Void() )="bbFiber::StartFiber"
-
-#rem monkeydoc
-
-Creates a new suspended fiber.
-
-Use `ResumeFiber` to start the fiber running.
-
-@return a new fiber handle.
-
-#end
-Function CreateFiber:Int( entry:Void() )="bbFiber::CreateFiber"
-
-#rem monkeydoc
-
-Resumes a suspended fiber.
-
-@param fiber a valid fiber handle.
-
-#end
-Function ResumeFiber:Void( fiber:Int )="bbFiber::ResumeFiber"
-
-#rem monkeydoc
-
-Terminates a fiber.
-
-@param fiber a valid fiber handle.
-
-#end
-Function TerminateFiber:Void( fiber:Int )="bbFiber::CancelFiber"
-
-
-#rem monkeydoc
-
-Suspends the currently running fiber.
-
-The fiber will remain suspended until `ResumeFiber` or `TerminateFiber` is used.
-
-#end
-Function SuspendCurrentFiber:Void()="bbFiber::SuspendCurrentFiber"
-
-#rem monkeydoc
-
-Gets the handle of the currently running fiber.
-
-@return the handle of the currnt fiber.
-
-#end
-Function GetCurrentFiber:Int()="bbFiber::GetCurrentFiber"
-
-Public
-
-Class Future<T>
-
-	Field _fiber:Int
-	Field _value:T
-	
-	Method New()
-		_fiber=std.fiber.GetCurrentFiber()
-	End
-	
-	Method Set( value:T )
-		_value=value
-		std.fiber.ResumeFiber( _fiber )
-	End
-	
-	Method Get:T()
-		std.fiber.SuspendCurrentFiber()
-		Return _value
-	End
-	
-End
-
-Function Await<T>:T( func:T() )
-
-	Local future:=New Future<T>
-	
-	StartFiber( Lambda()
-		future.Set( func() )
-	End )
-	
-	Return future.Get()
-End

+ 0 - 50
modules/std/_dev/generator.monkey2

@@ -1,50 +0,0 @@
-
-Namespace std.fiber
-
-Class Generator<T>
-
-	Property HasNext:Bool()
-	
-		Return _hasNext
-	End
-	
-	Method GetNext:T()
-	
-		Local value:=_next
-		
-		std.fiber.ResumeFiber( _fiber )
-		
-		Return value
-	End
-	
-	Protected
-	
-	Method Start( entry:Void() )
-	
-		_fiber=std.fiber.StartFiber( Lambda()
-		
-			_hasNext=True
-		
-			entry()
-			
-			_hasNext=False
-			
-		End )
-		
-	End
-	
-	Method Yield( value:T )
-	
-		_next=value
-		
-		std.fiber.SuspendCurrentFiber()
-	End
-	
-	Private
-	
-	Field _fiber:Int
-	Field _hasNext:Bool
-	Field _next:T
-	
-End
-

+ 0 - 216
modules/std/_dev/native/fiber.cpp

@@ -1,216 +0,0 @@
-
-#include "fiber.h"
-
-#include <thread>
-#include <mutex>
-#include <condition_variable>
-
-namespace{
-
-	const int MaxFibers=1024;
-	const int FiberIdMask=MaxFibers-1;
-
-	struct Semaphore{
-	
-		int count;
-		std::mutex mutex;
-		std::condition_variable cond_var;
-		
-		Semaphore( int count=0 ):count( count ){
-		}
-		
-		void wait(){
-			std::unique_lock<std::mutex> lock( mutex );
-			while( !count ) cond_var.wait( lock );
-			--count;
-		}
-		
-		void signal(){
-			std::unique_lock<std::mutex> lock( mutex );
-			++count;
-			cond_var.notify_one();
-		}
-	};
-	
-	struct Fiber{
-		int id;
-		bbGCFiber *gcFiber;
-		Semaphore semaphore;
-		Fiber *canceled;
-	};
-	
-	struct TerminateEx{
-	};
-	
-	Fiber fibers[MaxFibers];
-	bbGCFiber gcFibers[MaxFibers];
-	
-	Fiber *currentFiber;
-	
-	int readyStack[256];
-	int *readyStackSp=readyStack;
-	
-	void init(){
-
-		static bool done;
-		if( done ) return;
-		done=true;
-
-		for( int i=1;i<MaxFibers;++i ){
-			fibers[i].id=-i;
-			fibers[i].gcFiber=&gcFibers[i];
-		}
-		
-		fibers[0].id=0;
-		fibers[0].gcFiber=bbGC::currentFiber;
-		
-		currentFiber=&fibers[0];
-	}
-	
-	//not too sexy yet..
-	Fiber *allocFiber(){
-		for( int i=1;i<MaxFibers;++i ){
-			if( fibers[i].id>=0 ) continue;
-			Fiber *fiber=&fibers[i];
-			fiber->id=(-fiber->id)+MaxFibers;
-			fiber->canceled=nullptr;
-			return fiber;
-		}
-		printf( "Out of fibers!\n" );
-		exit( -1 );
-	}
-	
-	void freeFiber( Fiber *fiber ){
-		fiber->id=-fiber->id;
-	}
-	
-	Fiber *getFiber( int fiberid ){
-		
-		Fiber *fiber=&fibers[fiberid & FiberIdMask];
-		
-		if( fiber->id!=fiberid ){
-			printf( "Invalid fiber id\n" );fflush( stdout );
-			exit( -1 );
-		}
-		
-		return fiber;
-	}
-	
-	void pushReadyStack(){
-	
-		if( readyStackSp==readyStack+256 ){
-			printf( "Fiber stack overflow\n" );fflush( stdout );
-			exit( -1 );
-		}
-		*readyStackSp++=currentFiber->id;
-	}
-	
-	Fiber *popReadyStack(){
-	
-		while( readyStackSp!=readyStack ){
-			Fiber *fiber=getFiber( *--readyStackSp );
-			if( fiber ) return fiber;
-		}
-		printf( "Fiber stack underflow\n" );
-		fflush( stdout );
-		exit( -1 );
-	}
-	
-	void switchToFiber( Fiber *fiber ){
-
-		Fiber *current=currentFiber;
-		
-		currentFiber=fiber;
-		bbGC::currentFiber=fiber->gcFiber;
-		fiber->semaphore.signal();
-		
-		current->semaphore.wait();
-		if( current->canceled ) throw new TerminateEx;
-	}
-}
-
-namespace bbFiber{
-
-	int CreateFiber( Entry entry ){
-		init();
-
-		Fiber *fiber=allocFiber();
-		
-		std::thread thread( [=](){
-		
-			fiber->semaphore.wait();
-			
-			Fiber *nextFiber=fiber->canceled;
-			
-			if( !nextFiber ){
-
-				fiber->gcFiber->link();
-				
-				try{
-				
-					entry();
-					
-					nextFiber=popReadyStack();
-					
-				}catch( TerminateEx ){
-				
-					nextFiber=fiber->canceled;
-				}
-				
-				fiber->gcFiber->unlink();
-			}
-			
-			freeFiber( fiber );
-			
-			currentFiber=nextFiber;
-			bbGC::currentFiber=nextFiber->gcFiber;
-			nextFiber->semaphore.signal();
-		} );
-		
-		thread.detach();
-		
-		return fiber->id;
-	}
-	
-	int StartFiber( Entry entry ){
-	
-		int fiberid=CreateFiber( entry );
-		
-		ResumeFiber( fiberid );
-		
-		return fiberid;
-	}
-	
-	void ResumeFiber( int fiberid ){
-	
-		Fiber *fiber=getFiber( fiberid );
-		if( !fiber ) return;
-		
-		pushReadyStack();
-		
-		switchToFiber( fiber );
-	}
-	
-	void TerninateFiber( int fiberid ){
-	
-		Fiber *fiber=getFiber( fiberid );
-		if( !fiber ) return;
-		
-		fiber->canceled=currentFiber;
-		
-		switchToFiber( fiber );
-	}
-	
-	void SuspendCurrentFiber(){
-	
-		Fiber *fiber=popReadyStack();
-		
-		switchToFiber( fiber );
-	}
-	
-	int GetCurrentFiber(){
-		init();
-		
-		return currentFiber->id;
-	}
-}

+ 0 - 25
modules/std/_dev/native/fiber.h

@@ -1,25 +0,0 @@
-
-#ifndef BB_STD_FIBER_H
-#define BB_STD_FIBER_H
-
-#include <bbmonkey.h>
-
-namespace bbFiber{
-
-	typedef bbFunction<void()> Entry;
-	
-	int  StartFiber( Entry entry );
-	
-	int  CreateFiber( Entry entry );
-	
-	void ResumeFiber( int fiber );
-	
-	void TerminateFiber( int fiber );
-	
-	void SuspendCurrentFiber();
-	
-	int  GetCurrentFiber();
-}
-
-#endif
-