#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;
}
