#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>

#define V(XX) sem_post(&(XX))
#define P(XX) sem_wait(&(XX))

#define N 2
#define M 3

sem_t mutexHangar;
sem_t mutexSol;
sem_t mutexAir;
sem_t mutexCiel;
sem_t mutexPiste;

int iair = 0;
int isol = 0;
int avionsAtterrir = 20;
int avionsDecollage = 10;
int avions = avionsAtterrir + avionsDecollage;

void* sortirAvion(void* arg) {
	P(mutexHangar);
	isol++;

	printf("On sort un avion du hangar");

	V(mutexSol);
	if(isol < N) // Si la file au sol n'est pas pleine
		V(mutexHangar);
}

void* decollage(void* arg) {
    P(mutexSol);
    P(mutexPiste);
    isol--;

    printf("On fait décoller l'avion");

    V(mutexPiste);
    if(isol < M) // Si la file au sol n'est pas pleine
		V(mutexHangar);
}

void* amenerAvion(void* arg) {
    P(mutexCiel);
    iair++;

    printf("Un avion arrive");

    V(mutexAir);
    if(iair < M) // Si la file en l'air n'est pas pleine
		V(mutexCiel);
}

void* atterrissage(void* arg){
    P(mutexAir);
    P(mutexPiste);
    iair--;

    printf("Un avion atterit");

    V(mutexPiste);
    if(iair < N)  // Si la file en l'air n'est pas pleine
		V(mutexCiel);
}

int main()
{
    pthread_t sortirAvion, decollage, amenerAvion, atterrissage;

    V(mutexPiste);
    V(mutexHangar);
    V(mutexCiel);

    //  On pourrait utiliser plus de hasard
    for(int i = 0; i < avions; i++) {
        if (i < avionsAtterrir) {
            pthread_create(&amenerAvion, NULL, amenerAvion, NULL);
            pthread_create(&atterrissage, NULL, atterrissage, NULL);
        }
        if (i < avionsDecollage) {
            pthread_create(&sortirAvion, NULL, sortirAvion, NULL);
            pthread_create(&decollage, NULL, decollage, NULL);
        }
    }

    getchar();
    return 0;
}
