Skip to content
Snippets Groups Projects
SimplestFibTest.cpp 1.97 KiB
Newer Older
  • Learn to ignore specific revisions
  • Florian Schmaus's avatar
    Florian Schmaus committed
    #include <iostream>
    #include <list>
    #include <string>
    #include <thread>
    
    #include <cstdlib>
    
    Florian Schmaus's avatar
    Florian Schmaus committed
    
    #include "Runtime.hpp"
    #include "Common.hpp"
    #include "PrivateSemaphore.hpp"
    #include "BinaryPrivateSemaphore.hpp"
    #include "CountingPrivateSemaphore.hpp"
    #include "Debug.hpp"
    
    Florian Schmaus's avatar
    Florian Schmaus committed
    #include "emper.hpp"
    
    Florian Schmaus's avatar
    Florian Schmaus committed
    
    typedef struct {
    	int n;
    	int* result;
    	PS* sem;
    } fibParams;
    
    static void fib(void *voidParams) {
    	fibParams* params = static_cast<fibParams*>(voidParams);
    	int n = params->n;
    	int *result = params->result;
    
    	if (!result) {
    		std::cerr << "voidParams: " << voidParams << " n: " << params->n << " sem: " << params->sem << std::endl;
    		abort( );
    	}
    
    Florian Schmaus's avatar
    Florian Schmaus committed
    	PS* sem = params->sem;
    
    	if (n < 2) {
    		*result = n;
    	} else {
    		CPS newSem(2);
    
    		int a, b;
    
    		fibParams newParams1;
    		newParams1.n = n - 1;
    		newParams1.result = &a;
    		newParams1.sem = &newSem;
    		fibParams newParams2;
    		newParams2.n = n - 2;
    		newParams2.result = &b;
    		newParams2.sem = &newSem;
    
    		Fiber* f1 = Fiber::from(&fib, &newParams1);
    		Fiber* f2 = Fiber::from(&fib, &newParams2);
    
    		Runtime* runtime = Runtime::getRuntime();
    		runtime->schedule(*f1);
    		runtime->schedule(*f2);
    
    		WDBG("fib: Calling wait for n=" << n);
    		newSem.wait();
    
    		*result = a + b;
    	}
    
    	WDBG("fib: Calling signalAndExit for n=" << n);
    	sem->signalAndExit();
    }
    
    static void fibKickoff() {
    
    	const int fibNum = 2;
    
    Florian Schmaus's avatar
    Florian Schmaus committed
    	int result;
    	BPS sem;
    	fibParams params = { fibNum, &result, &sem };
    
    
    Florian Schmaus's avatar
    Florian Schmaus committed
    	Fiber* fibFiber = Fiber::from(fib, &params);
    	async(fibFiber);
    
    Florian Schmaus's avatar
    Florian Schmaus committed
    
    	sem.wait();
    
    	std::cout << "fib(" << fibNum << ") = " << result << std::endl;
    	exit(EXIT_SUCCESS);
    }
    
    int main(UNUSED_ARG int argc, UNUSED_ARG char *argv[]) {
    	//const unsigned nthreads = std::thread::hardware_concurrency();
    	const unsigned nthreads = 2;
    
    	std::cout << "Number of threads: " << nthreads << std::endl;
    
    	Runtime runtime(nthreads);
    
    	Fiber* fibFiber = Fiber::from(&fibKickoff);
    
    	std::cout << "Just alloacted alpha fiber at " << fibFiber << std::endl;
    
    	runtime.schedule(*fibFiber);
    
    	runtime.waitUntilFinished();
    	
    	return 0;
    }