From 96de07bb8f1cac9dfb69f71b7f268b1044e042e4 Mon Sep 17 00:00:00 2001
From: Lou Davila <lou.davilapr@hes-so.ch>
Date: Wed, 9 Apr 2025 14:35:17 +0200
Subject: [PATCH] Fixed concurrency problems on final bikes amount

---
 .gitignore |   1 +
 tp         | Bin 0 -> 21368 bytes
 tp.c       |  87 +++++++++++++++++++++++++++++++++++++++++++----------
 3 files changed, 72 insertions(+), 16 deletions(-)
 create mode 100644 .gitignore
 create mode 100755 tp

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f08278d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+*.pdf
\ No newline at end of file
diff --git a/tp b/tp
new file mode 100755
index 0000000000000000000000000000000000000000..71dc93f44ff8a634719c3edfc55ed4c9ad7a661c
GIT binary patch
literal 21368
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
LCSU<5fvz6_?~7e#

literal 0
HcmV?d00001

diff --git a/tp.c b/tp.c
index 5c21837..9b9366a 100644
--- a/tp.c
+++ b/tp.c
@@ -3,6 +3,7 @@
 #include <pthread.h>
 #include <semaphore.h>
 #include <unistd.h>
+#include <time.h>
 
 #define CAMION_CAPACITE 4
 
@@ -10,6 +11,7 @@ typedef struct {
     sem_t velos;
     sem_t bornes;
     int velos_dispo;
+    int personnes_attente;
     pthread_mutex_t mutex;
 } Site;
 
@@ -31,27 +33,39 @@ void *habitant(void *arg) {
             site_suivant = rand() % SITES;
         } while (site_suivant == site_actuel);
 
+        pthread_mutex_lock(&sites[site_actuel].mutex);
+        sites[site_actuel].personnes_attente++;
+        pthread_mutex_unlock(&sites[site_actuel].mutex);
+        
         printf("(GET) Habitant %d attend un vélo au site %d\n", id, site_actuel);
         sem_wait(&sites[site_actuel].velos);
+        
         pthread_mutex_lock(&sites[site_actuel].mutex);
         sites[site_actuel].velos_dispo--;
+        sites[site_actuel].personnes_attente--;
         pthread_mutex_unlock(&sites[site_actuel].mutex);
+        
         printf("(GET) Habitant %d prend un vélo au site %d\n", id, site_actuel);
         sem_post(&sites[site_actuel].bornes);
-
-        
-        //usleep((rand() % 100 + 100));
+        //usleep((rand() % 1000 + 1000));
+    
+        pthread_mutex_lock(&sites[site_suivant].mutex);
+        sites[site_suivant].personnes_attente++;
+        pthread_mutex_unlock(&sites[site_suivant].mutex);
         
-        printf("(PUT) Habitant %d attend d'avoir accès à une borne du site %d\n", id, site_actuel);
+        printf("(PUT) Habitant %d attend d'avoir accès à une borne du site %d\n", id, site_suivant);
         sem_wait(&sites[site_suivant].bornes);
+        
         pthread_mutex_lock(&sites[site_suivant].mutex);
         sites[site_suivant].velos_dispo++;
-        sem_post(&sites[site_suivant].velos);
+        sites[site_suivant].personnes_attente--;
         pthread_mutex_unlock(&sites[site_suivant].mutex);
+        
+        sem_post(&sites[site_suivant].velos);
         printf("(PUT) Habitant %d dépose un vélo au site %d\n", id, site_suivant);
+        //usleep((rand() % 1000 + 1000));
         
         site_actuel = site_suivant;
-        //usleep((rand() % 100 + 100));
         
         pthread_mutex_lock(&mutex_trajets);
         trajets_effectues++;
@@ -73,35 +87,66 @@ void *gestion_camion(void *arg) {
         
         for (int i = 0; i < SITES; i++) {
             pthread_mutex_lock(&sites[i].mutex);
-            if (sites[i].velos_dispo > BORNES - 2 && velos_camion < CAMION_CAPACITE && sites[i].velos_dispo > 1) {
-                while (sites[i].velos_dispo > BORNES - 2 && velos_camion < CAMION_CAPACITE && sites[i].velos_dispo > 1) {
+            
+            // Fixed truck logic - ensure atomic operations with proper locking
+            if (sites[i].velos_dispo > BORNES - 2 && velos_camion < CAMION_CAPACITE) {
+                int aRetirer = sites[i].velos_dispo - (BORNES - 2);
+                if (aRetirer > CAMION_CAPACITE - velos_camion)
+                    aRetirer = CAMION_CAPACITE - velos_camion;
+                
+                // Ensure we don't remove too many bikes
+                if (aRetirer > sites[i].velos_dispo-1)
+                    aRetirer = sites[i].velos_dispo-1;
+                
+                for (int j = 0; j < aRetirer; j++) {
                     sem_wait(&sites[i].velos);
-                    sem_post(&sites[i].bornes);
                     sites[i].velos_dispo--;
                     velos_camion++;
+                    sem_post(&sites[i].bornes);
                 }
+                
                 printf("Camion prend des vélos au site %d (Vélos dans camion: %d)\n", i, velos_camion);
-            } else if (sites[i].velos_dispo < 2 && velos_camion > 0) {
-                while (sites[i].velos_dispo < 2 && velos_camion > 0) {
+            } 
+            else if (sites[i].velos_dispo < 2 && velos_camion > 0) {
+                int bikes_to_add = 2 - sites[i].velos_dispo;
+                if (bikes_to_add > velos_camion)
+                    bikes_to_add = velos_camion;
+                
+                int available_slots = BORNES - sites[i].velos_dispo;
+                if (bikes_to_add > available_slots)
+                    bikes_to_add = available_slots;
+                
+                for (int j = 0; j < bikes_to_add; j++) {
                     sem_wait(&sites[i].bornes);
-                    sem_post(&sites[i].velos);
                     sites[i].velos_dispo++;
                     velos_camion--;
+                    sem_post(&sites[i].velos);
                 }
+                
                 printf("Camion dépose des vélos au site %d (Vélos dans camion: %d)\n", i, velos_camion);
             }
+            
             pthread_mutex_unlock(&sites[i].mutex);
-            //usleep((rand() % 100 + 100));
+            usleep((rand() % 100 + 100));
         }
         
+        pthread_mutex_lock(&mutex_velos_depot);
         if (velos_camion > 2) {
             velos_depot += (velos_camion - 2);
             velos_camion = 2;
             printf("Camion vide les vélos au dépôt (Vélos en dépôt: %d)\n", velos_depot);
+        } else if (velos_camion < 2 && velos_depot > 0) {
+            int needed = 2 - velos_camion;
+            if (needed > velos_depot)
+                needed = velos_depot;
+            velos_depot -= needed;
+            velos_camion += needed;
+            printf("Camion prend des vélos du dépôt (Vélos en dépôt: %d)\n", velos_depot);
         }
+        pthread_mutex_unlock(&mutex_velos_depot);
         
         printf("Camion fait un tour, vélos restants: %d, vélos en dépôt: %d\n", velos_camion, velos_depot);
-        usleep((rand() % 100 + 199));
+        usleep((rand() % 100 + 100));
     }
     return NULL;
 }
@@ -117,6 +162,7 @@ int main(int argc, char *argv[]) {
     TRAJETS = atoi(argv[3]);
     BORNES = atoi(argv[4]);
     
+    srand(time(NULL));
     sites = malloc(SITES * sizeof(Site));
     
     pthread_t habitants[HABITANTS], camion;
@@ -126,6 +172,7 @@ int main(int argc, char *argv[]) {
         sem_init(&sites[i].bornes, 0, 2);
         pthread_mutex_init(&sites[i].mutex, NULL);
         sites[i].velos_dispo = BORNES - 2;
+        sites[i].personnes_attente = 0;
     }
     
     for (int i = 0; i < HABITANTS; i++) {
@@ -145,9 +192,17 @@ int main(int argc, char *argv[]) {
         total_velos += sites[i].velos_dispo;
         printf("Site %d contains %d bykes\n", i, sites[i].velos_dispo);
     }
-    total_velos += 2;
+    total_velos+= 2;
     printf("Nombre total de vélos à la fin : %d (doit être %d)\n", total_velos, SITES * (BORNES - 2) + 2);
     printf("Simulation terminée.\n");
+    
+    for (int i = 0; i < SITES; i++) {
+        sem_destroy(&sites[i].velos);
+        sem_destroy(&sites[i].bornes);
+        pthread_mutex_destroy(&sites[i].mutex);
+    }
+    pthread_mutex_destroy(&mutex_trajets);
+    pthread_mutex_destroy(&mutex_velos_depot);
     free(sites);
     return 0;
-}
+}
\ No newline at end of file
-- 
GitLab