#include <iostream>
#include <semaphore.h>
#include <fstream>
#include <pthread.h>

#define P sem_post
#define V sem_wait

#define L pthread_mutex_lock
#define U pthread_mutex_unlock

using namespace std;

sem_t case_vide_s;
sem_t case_pleine_s;

sem_t case_vide_a;
sem_t case_pleine_a;
pthread_mutex_t mutex;

void* lire(void* data);
void* ecrire(void* data);
int Air[1];
int Sol[1];
int iDepot_a;
int iExtrait_a;
int iDepot_s;
int iExtrait_s;

typedef struct data
{
    int var;
    pthread_mutex_t mutex;
} data;

    ///Fonction pour le buffer AIR
static void* Atterrissage(void* data)
{
    for(int i = 0; i < 10; i++)
    {
        L(&mutex);
            P(&case_pleine_a);
            {
                cout << "Atterit: " << Air[iExtrait_a] << endl;
                iExtrait_a ++;
                iExtrait_a %= 1;
                sleep(0.7);
            }
            V(&case_vide_a);
        U(&mutex);
    }
}

static void* AmenerAvion(void* data)
{
    for(int i = 0; i < 10; i++)
    {
        P(&case_vide_a);
        {
            cout << "Avion amene." << endl;
            Air[iDepot_a] = iDepot_a;
            iDepot_a ++;
            iDepot_a %= 1;
            sleep(0.5);
        }
        V(&case_pleine_a);
    }
}

    ///Fonction pour le buffer SOL
static void* Decollage(void* data)
{
    for(int i = 0; i < 10; i++)
    {
        L(&mutex);
            P(&case_pleine_s);
            {
                cout << "lu: " << Sol[iExtrait_s] << endl;
                iExtrait_s ++;
                iExtrait_s %= 1;
                sleep(0.7);
            }
            V(&case_vide_s);
        U(&mutex);
    }
}

static void* SortirAvion(void* data)
{
    for(int i = 0; i < 10; i++)
    {
        P(&case_vide_s);
        {
            cout << "Avion sorti" << endl;
            Sol[iDepot_s] = iDepot_s;
            iDepot_s ++;
            iDepot_s %= 1;
            sleep(0.5);
        }
        V(&case_pleine_s);
    }
}

int main()
{
    //Variables
    char a;
    iDepot_s = 0;
    iExtrait_s = 0;
    iDepot_a = 0;
    iExtrait_a = 0;

    //Gestion des threads
    pthread_t thr_atterrissage;
    pthread_t thr_ameneravion;
    pthread_t thr_decollage;
    pthread_t thr_sortiravion;

        //Sémaphores
    sem_init(&case_vide_a, 1, 0);
    sem_init(&case_pleine_a,0, 1);

    sem_init(&case_vide_s, 1, 0);
    sem_init(&case_pleine_s,0, 1);

        //Mutex
    mutex = PTHREAD_MUTEX_INITIALIZER;

    pthread_create(&thr_atterrissage, NULL, Atterrissage, NULL);
    pthread_create(&thr_ameneravion, NULL, AmenerAvion, NULL);

    pthread_create(&thr_decollage, NULL, Decollage, NULL);
    pthread_create(&thr_sortiravion, NULL, SortirAvion, NULL);

    cin >> a;
    return 0;
}

