Skip to content
Snippets Groups Projects
BinaryPrivateSemaphoreTest.cpp 1.02 KiB
Newer Older
  • Learn to ignore specific revisions
  • // SPDX-License-Identifier: LGPL-3.0-or-later
    // Copyright © 2021 Florian Fischer
    #include "BinaryPrivateSemaphore.hpp"
    #include "CountingPrivateSemaphore.hpp"
    #include "Debug.hpp"
    #include "emper-config.h"
    #include "emper.hpp"
    
    static BPS* sems;
    
    static const unsigned CYCLE_LENGTH = 3;
    static const unsigned CYCLE_COUNT = 100;
    static const unsigned ITERATIONS = EMPER_LOG_LEVEL > Info ? 100 : 25000;
    
    void emperTest() {
    	CPS cps;
    	const unsigned count = CYCLE_COUNT * CYCLE_LENGTH;
    	sems = new BPS[count];
    	for (unsigned i = 0; i < count; ++i) {
    		spawn(
    				[=] {
    					const unsigned cycleNum = i / CYCLE_LENGTH;
    					const unsigned cycleStart = CYCLE_LENGTH * cycleNum;
    					BPS& mySem = sems[i];
    					const unsigned next = cycleStart + ((i + 1) % CYCLE_LENGTH);
    					BPS& nextSem = sems[next];
    
    					for (unsigned it = 0; it < ITERATIONS; ++it) {
    						if (i == cycleStart) nextSem.signal();
    
    						mySem.wait();
    						mySem.reset();
    
    						if (i != cycleStart) nextSem.signal();
    					}
    				},
    				cps);
    	}
    
    	cps.wait();
    
    	delete[] sems;
    }