diff --git a/G17_bykes/main.c b/G17_bykes/main.c index 57fde56aaaa549257146077449ff3c49b6cd4bf9..f8adf0c2bc030837b6e706902eba71b7d00a71a1 100644 --- a/G17_bykes/main.c +++ b/G17_bykes/main.c @@ -7,49 +7,48 @@ #include <time.h> #include <semaphore.h> -#define CAMION_CAPACITE_MAX 4 -#define CAMION_CAPACITE_TYP 2 -#define SITE_CAPACITE_MIN 2 +#define TRUCK_CAPACITE_MAX 4 +#define TRUCK_CAPACITE_TYP 2 +#define CITY_CAPACITY_MIN 2 #define DEPOT 0 -sem_t *sem_BorneFree; +sem_t *sem_FreeSlot; sem_t *sem_BikeFree; pthread_mutex_t *mutex; pthread_barrier_t b; -bool end = false; int personsFinished=0; -struct habitant{ +struct civilian{ int num_thread; int nb_trajet; int max_trajets; - int i_site; - int nbSites; - int nbornes; + int i_cities; + int nbcitiess; + int nslotss; }; -struct camionette{ +struct Truck{ int num_thread; - int n_Velo; - int i_site; - int nbSites; - int nbornes; - int nbHabs; + int n_bike; + int i_cities; + int nbcitiess; + int nslotss; + int nbCivilians; }; -struct site{ +struct cities{ int nb_bikesParked; int nb_P_waiting; }; int rand_Dc(); int rand_D(); -//void habitants_PassiveMode(void *arg); -void *Camion(void *arg); -void *habitants(void *arg); -struct site *sites; //this table is the size of the number of sites, each sites has NParkinglot and each numbers represents a free parkinglot +//void civilians_PassiveMode(void *arg); +void *trucks(void *arg); +void *civilians(void *arg); +struct cities *citiess; //this table is the size of the number of citiess, each citiess has NParkinglot and each numbers represents a free parkinglot int main(int argc, char **argv){ @@ -57,149 +56,145 @@ int main(int argc, char **argv){ perror("erreur d'arguments d'entrée\n"); return EXIT_FAILURE; } - int nbSites = atoi(argv[1]); //S 10 - int nbHabs = atoi(argv[2]); //H 100 - int nbTrajets = atoi(argv[3]); //M 10 - int nbBorne = atoi(argv[4]); //N 10 - nbSites += 1; + int nbcitiess = atoi(argv[1]); //S 10 + int nbCivilians = atoi(argv[2]); //H 100 + int nbTrajets = atoi(argv[3]); //M 10 + int nbslots = atoi(argv[4]); //N 10 + nbcitiess += 1; srand(0); - pthread_t *threadHabs = malloc(sizeof(pthread_t)*nbHabs); - pthread_t *threadCam = malloc(sizeof(pthread_t)); - sites = calloc(nbSites, sizeof(struct site)); - struct habitant *habs = calloc(nbHabs, sizeof(struct habitant)); - struct camionette *camion = malloc(sizeof(struct camionette)); - - for(int j = 0; j<nbSites; j++){ - sites[j].nb_bikesParked = nbBorne-2; - sites[j].nb_P_waiting = 0; + pthread_t *threadCivilians = malloc(sizeof(pthread_t)*nbCivilians); + pthread_t *threadTruck = malloc(sizeof(pthread_t)); + citiess = calloc(nbcitiess, sizeof(struct cities)); + struct civilian *Civilians = calloc(nbCivilians, sizeof(struct civilian)); + struct Truck *truck = malloc(sizeof(struct Truck)); + + for(int j = 0; j<nbcitiess; j++){ + citiess[j].nb_bikesParked = nbslots-2; + citiess[j].nb_P_waiting = 0; } - sites[DEPOT].nb_bikesParked = 0; //depot avec 0 velos au depart - - camion->i_site = 0; - camion->n_Velo = CAMION_CAPACITE_TYP; - camion->nbornes = nbBorne; - camion->num_thread = nbHabs; - camion->nbSites = nbSites; - camion->nbHabs = nbHabs; - - sem_BikeFree = malloc(sizeof(sem_t)*nbSites); - sem_BorneFree = malloc(sizeof(sem_t)*nbSites); - //mutex = malloc(sizeof(pthread_mutex_t)*(nbHabs+1)); - mutex = malloc(sizeof(pthread_mutex_t)*nbSites); - - for(int x =0; x<nbSites; x++){ - sem_init(&sem_BikeFree[x], 0, nbBorne-2);//8); - sem_init(&sem_BorneFree[x], 0, nbBorne-(nbBorne-2));//2); - pthread_mutex_init(&mutex[x], NULL); //mutex du camion + citiess[DEPOT].nb_bikesParked = 0; + + truck->i_cities = 0; + truck->n_bike = TRUCK_CAPACITE_TYP; + truck->nslotss = nbslots; + truck->num_thread = nbCivilians; + truck->nbcitiess = nbcitiess; + truck->nbCivilians = nbCivilians; + + sem_BikeFree = malloc(sizeof(sem_t)*nbcitiess); + sem_FreeSlot = malloc(sizeof(sem_t)*nbcitiess); + mutex = malloc(sizeof(pthread_mutex_t)*nbcitiess); + + for(int x =0; x<nbcitiess; x++){ + sem_init(&sem_BikeFree[x], 0, nbslots-2);//8); + sem_init(&sem_FreeSlot[x], 0, nbslots-(nbslots-2));//2); + pthread_mutex_init(&mutex[x], NULL); //mutex du truck } - pthread_barrier_init(&b, NULL, nbHabs); + pthread_barrier_init(&b, NULL, nbCivilians); - if(pthread_create(threadCam, NULL, Camion, (void*)camion)!=0){ + if(pthread_create(threadTruck, NULL, trucks, (void*)truck)!=0){ perror("thread creation error"); return EXIT_FAILURE; } - for(int i=0; i<nbHabs; i++){ - habs[i].max_trajets = nbTrajets; - habs[i].nbornes = nbBorne; - habs[i].nbSites = nbSites; - habs[i].num_thread = i; - habs[i].nb_trajet = 0; - habs[i].i_site = (rand()%(habs[i].nbSites - 1))+1; - pthread_mutex_init(&mutex[i], NULL); //mutex par habitants - if(pthread_create(&threadHabs[i], NULL, habitants, (void*)&habs[i])!=0){ + for(int i=0; i<nbCivilians; i++){ + Civilians[i].max_trajets = nbTrajets; + Civilians[i].nslotss = nbslots; + Civilians[i].nbcitiess = nbcitiess; + Civilians[i].num_thread = i; + Civilians[i].nb_trajet = 0; + Civilians[i].i_cities = (rand()%(Civilians[i].nbcitiess - 1))+1; + pthread_mutex_init(&mutex[i], NULL); //mutex par civilians + if(pthread_create(&threadCivilians[i], NULL, civilians, (void*)&Civilians[i])!=0){ perror("thread creation error"); return EXIT_FAILURE; } } //pthread_barrier_wait(&b); - if(pthread_join(*threadCam, NULL)){ // va retourner un truc après + if(pthread_join(*threadTruck, NULL)){ perror("thread join error"); return EXIT_FAILURE; } //thread join - for(int i=0; i<nbHabs; i++){ - if(pthread_join(threadHabs[i], NULL)){ //va retourner un truc après + for(int i=0; i<nbCivilians; i++){ + if(pthread_join(threadCivilians[i], NULL)){ perror("thread join error"); return EXIT_FAILURE; } } //free the memory - for(int i=0; i<nbSites; i++){ + for(int i=0; i<nbcitiess; i++){ sem_destroy(&sem_BikeFree[i]); - sem_destroy(&sem_BorneFree[i]); + sem_destroy(&sem_FreeSlot[i]); } - for(int i=0; i<nbHabs+1; i++){ + for(int i=0; i<nbCivilians+1; i++){ pthread_mutex_destroy(&mutex[i]); } pthread_barrier_destroy(&b); - free(threadHabs); - free(threadCam); + free(threadCivilians); + free(threadTruck); free(sem_BikeFree); - free(sem_BorneFree); + free(sem_FreeSlot); free(mutex); printf("***************** CYCLING TERMINATED ***************\n"); int sum=0; - for(int i=1; i<nbSites; i++){ - printf("Terminal %d contains %d bikes\n", i, sites[i].nb_bikesParked); - sum+=sites[i].nb_bikesParked; + for(int i=1; i<nbcitiess; i++){ + printf("Terminal %d contains %d bikes\n", i, citiess[i].nb_bikesParked); + sum+=citiess[i].nb_bikesParked; } - printf("total number of bikes in town: %d, in depot: %d, in truck: %d, total: %d\n", sum, sites[DEPOT].nb_bikesParked, camion->n_Velo, camion->n_Velo+sites[DEPOT].nb_bikesParked+sum); + printf("total number of bikes in town: %d, in depot: %d, in truck: %d, total: %d\n", sum, citiess[DEPOT].nb_bikesParked, truck->n_bike, truck->n_bike+citiess[DEPOT].nb_bikesParked+sum); - free(habs); - free(camion); - free(sites); - - //srand(time(NULL)); - //nb sites, nb habs, nb de voyaegs par habitants, nb de bornes par sites + free(Civilians); + free(truck); + free(citiess); return EXIT_SUCCESS; } -void *habitants(void *arg){ - struct habitant *hab = (struct habitant*)arg; +void *civilians(void *arg){ + struct civilian *hab = (struct civilian*)arg; int j=0; int val; - // inside a Mtrajets loop for each habitants + // inside a Mtrajets loop for each civilians while(hab->nb_trajet < hab->max_trajets){ - //waits for a bike in site i - //if(hab->i_site==4){ - sem_getvalue(&sem_BorneFree[hab->i_site],&val); - pthread_mutex_lock(&mutex[hab->i_site]); - printf("(GET) person %d starts from terminal %d (%d bykes, %d persons waiting, semBorneFree_val : %d)\n", hab->num_thread, hab->i_site, sites[hab->i_site].nb_bikesParked, sites[hab->i_site].nb_P_waiting, val);//sites[hab->i_site].nb_P_waiting); - pthread_mutex_unlock(&mutex[hab->i_site]); + //waits for a bike in cities i + //if(hab->i_cities==4){ + sem_getvalue(&sem_FreeSlot[hab->i_cities],&val); + pthread_mutex_lock(&mutex[hab->i_cities]); + printf("(GET) person %d starts from terminal %d (%d bykes, %d persons waiting, semslotsFree_val : %d)\n", hab->num_thread, hab->i_cities, citiess[hab->i_cities].nb_bikesParked, citiess[hab->i_cities].nb_P_waiting, val);//citiess[hab->i_cities].nb_P_waiting); + pthread_mutex_unlock(&mutex[hab->i_cities]); //} - if(sites[hab->i_site].nb_bikesParked<=0){// && hab->i_site == 4){ - printf("person %d is STUCK at terminal %d: rack empty : %d bikes\n", hab->num_thread, hab->i_site, sites[hab->i_site].nb_bikesParked); + if(citiess[hab->i_cities].nb_bikesParked<=0){// && hab->i_cities == 4){ + printf("person %d is STUCK at terminal %d: rack empty : %d bikes\n", hab->num_thread, hab->i_cities, citiess[hab->i_cities].nb_bikesParked); } - pthread_mutex_lock(&mutex[hab->i_site]); - sites[hab->i_site].nb_P_waiting += 1; - pthread_mutex_unlock(&mutex[hab->i_site]); + pthread_mutex_lock(&mutex[hab->i_cities]); + citiess[hab->i_cities].nb_P_waiting += 1; + pthread_mutex_unlock(&mutex[hab->i_cities]); - sem_wait(&sem_BikeFree[hab->i_site]); - pthread_mutex_lock(&mutex[hab->i_site]); - sites[hab->i_site].nb_P_waiting -= 1; - sites[hab->i_site].nb_bikesParked -= 1; //critical section - //if(hab->i_site==4){ - //printf("person %d leaves terminal %d by bike\n", hab->num_thread, hab->i_site); + sem_wait(&sem_BikeFree[hab->i_cities]); + pthread_mutex_lock(&mutex[hab->i_cities]); + citiess[hab->i_cities].nb_P_waiting -= 1; + citiess[hab->i_cities].nb_bikesParked -= 1; //critical section + //if(hab->i_cities==4){ + //printf("person %d leaves terminal %d by bike\n", hab->num_thread, hab->i_cities); //} - pthread_mutex_unlock(&mutex[hab->i_site]); - sem_post(&sem_BorneFree[hab->i_site]); - //if(hab->i_site==4){ - printf("person %d leaves terminal %d by bike\n", hab->num_thread, hab->i_site); + pthread_mutex_unlock(&mutex[hab->i_cities]); + sem_post(&sem_FreeSlot[hab->i_cities]); + //if(hab->i_cities==4){ + printf("person %d leaves terminal %d by bike\n", hab->num_thread, hab->i_cities); //} - //go to place j = rand()%nsites and j != i + //go to place j = rand()%ncitiess and j != i do{ - j = (rand()%(hab->nbSites - 1))+1; - }while(j==hab->i_site); + j = (rand()%(hab->nbcitiess - 1))+1; + }while(j==hab->i_cities); usleep(rand_D()); @@ -207,25 +202,25 @@ void *habitants(void *arg){ //if(j==4){ sem_getvalue(&sem_BikeFree[j],&val); pthread_mutex_lock(&mutex[j]); - printf("(PUT) person %d arrives at terminal %d (%d bykes, %d persons waiting, semBikeFree_val : %d)\n", hab->num_thread, j, sites[j].nb_bikesParked, sites[j].nb_P_waiting, val);//sites[j].nb_P_waiting); + printf("(PUT) person %d arrives at terminal %d (%d bykes, %d persons waiting, semBikeFree_val : %d)\n", hab->num_thread, j, citiess[j].nb_bikesParked, citiess[j].nb_P_waiting, val);//citiess[j].nb_P_waiting); pthread_mutex_unlock(&mutex[j]); //} - if(sites[j].nb_bikesParked>=hab->nbornes){//} && j == 4){ - printf("person %d is STUCK at terminal %d: rack full : %d bikes\n", hab->num_thread, j, sites[j].nb_bikesParked); + if(citiess[j].nb_bikesParked>=hab->nslotss){//} && j == 4){ + printf("person %d is STUCK at terminal %d: rack full : %d bikes\n", hab->num_thread, j, citiess[j].nb_bikesParked); } pthread_mutex_lock(&mutex[j]); - sites[j].nb_P_waiting += 1; + citiess[j].nb_P_waiting += 1; pthread_mutex_unlock(&mutex[j]); - sem_wait(&sem_BorneFree[j]); + sem_wait(&sem_FreeSlot[j]); pthread_mutex_lock(&mutex[j]); //deposit his bycycle - sites[j].nb_P_waiting -= 1; - sites[j].nb_bikesParked += 1; //critical section + citiess[j].nb_P_waiting -= 1; + citiess[j].nb_bikesParked += 1; //critical section pthread_mutex_unlock(&mutex[j]); sem_post(&sem_BikeFree[j]); //if(j==4){ @@ -234,86 +229,86 @@ void *habitants(void *arg){ //does whatever he has to do for a D delay time (waits for rand() 1000->1999us) usleep(rand_D()); - //changes his position from site i = j (j is the new site) - hab->i_site = j; + //changes his position from cities i = j (j is the new cities) + hab->i_cities = j; hab->nb_trajet += 1; } printf("person %d stops\n", hab->num_thread); - pthread_mutex_lock(&mutex[hab->i_site]); + pthread_mutex_lock(&mutex[hab->i_cities]); personsFinished += 1; - pthread_mutex_unlock(&mutex[hab->i_site]); + pthread_mutex_unlock(&mutex[hab->i_cities]); pthread_barrier_wait(&b); //printf("machin bidule a passé la barriere !!!! : %d, tot_trajets = %d\n", hab->num_thread, hab->nb_trajet); return NULL; } -void *Camion(void *arg){ - struct camionette *camion = (struct camionette*)arg; +void *trucks(void *arg){ + struct Truck *truck = (struct Truck*)arg; int tmp_nbBikes; - while(personsFinished < camion->nbHabs){ - //1 : for each sites from 1 to S (0 is the depot) - for(int i=1; i<camion->nbSites; i++){ + while(personsFinished < truck->nbCivilians){ + //1 : for each citiess from 1 to S (0 is the depot) + for(int i=1; i<truck->nbcitiess; i++){ //spreads the bikes evenly - //too many bikes in this site - tmp_nbBikes = camion->n_Velo; - if(sites[i].nb_bikesParked > (camion->nbornes-2) && camion->n_Velo < CAMION_CAPACITE_MAX){ - while(sites[i].nb_bikesParked > (camion->nbornes-2) && camion->n_Velo < CAMION_CAPACITE_MAX){ + //too many bikes in this cities + tmp_nbBikes = truck->n_bike; + if(citiess[i].nb_bikesParked > (truck->nslotss-2) && truck->n_bike < TRUCK_CAPACITE_MAX){ + while(citiess[i].nb_bikesParked > (truck->nslotss-2) && truck->n_bike < TRUCK_CAPACITE_MAX){ sem_wait(&sem_BikeFree[i]); pthread_mutex_lock(&mutex[i]); - camion->n_Velo += 1; - sites[i].nb_bikesParked -= 1; + truck->n_bike += 1; + citiess[i].nb_bikesParked -= 1; pthread_mutex_unlock(&mutex[i]); - sem_post(&sem_BorneFree[i]); + sem_post(&sem_FreeSlot[i]); } pthread_mutex_lock(&mutex[i]); - printf("truck removes %d bikes at terminal %d (%d bikes, %d persons waiting, %d left in truck)\n", camion->n_Velo-tmp_nbBikes, i, sites[i].nb_bikesParked, sites[i].nb_P_waiting, camion->n_Velo); + printf("truck removes %d bikes at terminal %d (%d bikes, %d persons waiting, %d left in truck)\n", truck->n_bike-tmp_nbBikes, i, citiess[i].nb_bikesParked, citiess[i].nb_P_waiting, truck->n_bike); pthread_mutex_unlock(&mutex[i]); } - // not enough bikes in this site - // until he gets at least 2 bikes (or the camion is empty) - else if(sites[i].nb_bikesParked < SITE_CAPACITE_MIN && camion->n_Velo > 0){ - tmp_nbBikes = camion->n_Velo; - while(sites[i].nb_bikesParked < SITE_CAPACITE_MIN && camion->n_Velo > 0){ - sem_wait(&sem_BorneFree[i]); + // not enough bikes in this cities + // until he gets at least 2 bikes (or the truck is empty) + else if(citiess[i].nb_bikesParked < CITY_CAPACITY_MIN && truck->n_bike > 0){ + tmp_nbBikes = truck->n_bike; + while(citiess[i].nb_bikesParked < CITY_CAPACITY_MIN && truck->n_bike > 0){ + sem_wait(&sem_FreeSlot[i]); pthread_mutex_lock(&mutex[i]); - camion->n_Velo -= 1; - sites[i].nb_bikesParked += 1; + truck->n_bike -= 1; + citiess[i].nb_bikesParked += 1; pthread_mutex_unlock(&mutex[i]); sem_post(&sem_BikeFree[i]); } pthread_mutex_lock(&mutex[i]); - printf("truck adds %d bikes at terminal %d (%d bikes, %d persons waiting, %d left in truck)\n", tmp_nbBikes-camion->n_Velo, i, sites[i].nb_bikesParked, sites[i].nb_P_waiting, camion->n_Velo); + printf("truck adds %d bikes at terminal %d (%d bikes, %d persons waiting, %d left in truck)\n", tmp_nbBikes-truck->n_bike, i, citiess[i].nb_bikesParked, citiess[i].nb_P_waiting, truck->n_bike); pthread_mutex_unlock(&mutex[i]); } } //2: goes to the depot to rebalance the truck's content to 2 bycycles - tmp_nbBikes = camion->n_Velo; - if(camion->n_Velo < CAMION_CAPACITE_TYP){ - if(sites[DEPOT].nb_bikesParked > 0){ - while(camion->n_Velo < CAMION_CAPACITE_TYP && sites[DEPOT].nb_bikesParked > 0){ - camion->n_Velo += 1; + tmp_nbBikes = truck->n_bike; + if(truck->n_bike < TRUCK_CAPACITE_TYP){ + if(citiess[DEPOT].nb_bikesParked > 0){ + while(truck->n_bike < TRUCK_CAPACITE_TYP && citiess[DEPOT].nb_bikesParked > 0){ + truck->n_bike += 1; pthread_mutex_lock(&mutex[DEPOT]); - sites[DEPOT].nb_bikesParked -= 1; + citiess[DEPOT].nb_bikesParked -= 1; pthread_mutex_unlock(&mutex[DEPOT]); } pthread_mutex_lock(&mutex[DEPOT]); - printf("(DEPOT) truck gets %d bikes at terminal %d (%d bikes, %d persons waiting, %d left in truck)\n", camion->n_Velo-tmp_nbBikes, DEPOT, sites[DEPOT].nb_bikesParked, sites[DEPOT].nb_P_waiting, camion->n_Velo); + printf("(DEPOT) truck gets %d bikes at terminal %d (%d bikes, %d persons waiting, %d left in truck)\n", truck->n_bike-tmp_nbBikes, DEPOT, citiess[DEPOT].nb_bikesParked, citiess[DEPOT].nb_P_waiting, truck->n_bike); pthread_mutex_unlock(&mutex[DEPOT]); } } - else if (camion->n_Velo > CAMION_CAPACITE_TYP){ - while(camion->n_Velo > CAMION_CAPACITE_TYP){ - camion->n_Velo -= 1; + else if (truck->n_bike > TRUCK_CAPACITE_TYP){ + while(truck->n_bike > TRUCK_CAPACITE_TYP){ + truck->n_bike -= 1; pthread_mutex_lock(&mutex[DEPOT]); - sites[DEPOT].nb_bikesParked += 1; + citiess[DEPOT].nb_bikesParked += 1; pthread_mutex_unlock(&mutex[DEPOT]); } pthread_mutex_lock(&mutex[DEPOT]); - printf("(DEPOT) truck deposit %d bikes at terminal %d (%d bikes, %d persons waiting, %d left in truck)\n", tmp_nbBikes-camion->n_Velo, DEPOT, sites[DEPOT].nb_bikesParked, sites[DEPOT].nb_P_waiting, camion->n_Velo); + printf("(DEPOT) truck deposit %d bikes at terminal %d (%d bikes, %d persons waiting, %d left in truck)\n", tmp_nbBikes-truck->n_bike, DEPOT, citiess[DEPOT].nb_bikesParked, citiess[DEPOT].nb_P_waiting, truck->n_bike); pthread_mutex_unlock(&mutex[DEPOT]); } //3: pause betweem 100us up to 199us