#include <stdlib.h>	 // for exit, EXIT_FAILURE, EXIT_SUC...

#include <atomic>	 // for atomic_uint, __atomic_base

#include "CountingPrivateSemaphore.hpp"	 // for CountingPrivateSemaphore
#include "Runtime.hpp"									 // for Runtime
#include "emper-common.h"								 // for UNUSED_ARG
#include "emper.hpp"										 // for async, spawn

static std::atomic_uint counter;

static void increaseCounterByOne() { counter++; }

static void mainFiber(void) {
	const unsigned int FIBER_COUNT = 100;

	CountingPrivateSemaphore cps;

	for (unsigned int i = 0; i < FIBER_COUNT; ++i) {
		spawn(&increaseCounterByOne, cps);
	}

	cps.wait();

	if (counter != FIBER_COUNT) {
		exit(EXIT_FAILURE);
	}

	exit(EXIT_SUCCESS);
}

int main(UNUSED_ARG int arg, UNUSED_ARG char *argv[]) {
	Runtime runtime;

	async(&mainFiber);

	runtime.waitUntilFinished();

	return EXIT_FAILURE;
}