#include <iostream>
#include <cstdlib>
#include <ctime>
#include <unistd.h>
#include <iomanip>
#include <sys/mman.h>
#include <chrono>

#include "ProlificScheduler.hpp"
#include "CollectiveScheduler.hpp"
#include "SortTask_mmap.hpp"

void print_matrix(int* A, int n){
	for(int i=0; i<n;i++) {
		for(int j=0; j<n; j++) {
			std::cout<<std::setw(5) << A[i*n +j] << " ";
		}
		std::cout<< "\n";
	}
}

int main() {
	srand(time(0));
	int n=3;
	
	int* A=(int*) mmap(NULL,n*n*sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS , -1, 0);
	
	if( A==MAP_FAILED) {
	        std::cerr<< "Sfalma kata ti desmeysi tis mmap \n";
	       	return 1;
	}	
	
	for(int i=0; i<n*n; i++){
		A[i]=(rand()%2001) - 1000;
	}
	std::cout<< "Arxikos Pinakas: \n" ;
	print_matrix(A,n);

	SortTask mySortTask(A,n);
//	std::cout<< "Xrisi prolific scheduler me mmap \n" ;
	std::cout<< "Xrisi collective scheduler me mmap \n" ;
//	ProlificScheduler scheduler(n);
	CollectiveScheduler scheduler(n);
	auto start_time = std::chrono::high_resolution_clock::now();

	scheduler.execute(&mySortTask);

	auto end_time = std::chrono::high_resolution_clock::now();

	std::chrono::duration<double, std::milli> elapsed=end_time - start_time;
//	std::cout<< "\n O prolific scheduler oloklirwse to task se " <<  elapsed.count() << " ms \n";
	std::cout<< "\n O collective scheduler oloklirwse to task se " <<  elapsed.count() << " ms \n";

	std::cout<< "Taksinomimenos pinakas(ana grammi) : \n";
	print_matrix(A,n);

//To antistoixo delete 
	munmap(A,n*n*sizeof(int));

	return 0;
}
