Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add a SIMIX_sem_get_capacity() function
authormquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 17 Mar 2010 10:03:24 +0000 (10:03 +0000)
committermquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 17 Mar 2010 10:03:24 +0000 (10:03 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@7256 48e7efb5-ca39-0410-a469-dd3cf9ba447f

ChangeLog
src/include/simix/simix.h
src/simix/smx_synchro.c

index 237b6ef..f89a885 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -25,6 +25,8 @@ SimGrid (3.3.5-svn) unstable; urgency=low
       and call MSG_action_trace_run(NULL)
     You can still have one merged file for each processes.
   * Kill the MSG_paje_output() function. It's a noop since 2 years.
       and call MSG_action_trace_run(NULL)
     You can still have one merged file for each processes.
   * Kill the MSG_paje_output() function. It's a noop since 2 years.
+ SIMIX:
+  * add a SIMIX_sem_get_capacity() function
       
  -- Da SimGrid team <simgrid-devel@lists.gforge.inria.fr>
 
       
  -- Da SimGrid team <simgrid-devel@lists.gforge.inria.fr>
 
index 631ab68..97eb4d0 100644 (file)
@@ -150,6 +150,7 @@ XBT_PUBLIC(void) SIMIX_sem_block_onto(smx_sem_t sem);
 XBT_PUBLIC(void) SIMIX_sem_acquire(smx_sem_t sem);
 XBT_PUBLIC(void) SIMIX_sem_acquire_timeout(smx_sem_t sem, double max_duration);
 XBT_PUBLIC(unsigned int) SIMIX_sem_acquire_any(xbt_dynar_t sems);
 XBT_PUBLIC(void) SIMIX_sem_acquire(smx_sem_t sem);
 XBT_PUBLIC(void) SIMIX_sem_acquire_timeout(smx_sem_t sem, double max_duration);
 XBT_PUBLIC(unsigned int) SIMIX_sem_acquire_any(xbt_dynar_t sems);
+XBT_PUBLIC(int) SIMIX_sem_get_capacity(smx_sem_t sem);
 
 
 /************************** Action handling ************************************/
 
 
 /************************** Action handling ************************************/
index b740dea..92ddf27 100644 (file)
@@ -433,6 +433,14 @@ XBT_INLINE int SIMIX_sem_would_block(smx_sem_t sem) {
   return (sem->capacity>0);
 }
 
   return (sem->capacity>0);
 }
 
+/** @brief Returns the current capacity of the semaphore
+ *
+ * If it's negative, that's the amount of processes locked on the semaphore
+ */
+int SIMIX_sem_get_capacity(smx_sem_t sem){
+  return sem->capacity;
+}
+
 /**
  * \brief Waits on a semaphore
  *
 /**
  * \brief Waits on a semaphore
  *
@@ -455,6 +463,7 @@ void SIMIX_sem_acquire(smx_sem_t sem) {
     return;
   }
 
     return;
   }
 
+  sem->capacity--;
   /* Always create an action null in case there is a host failure */
   act_sleep = SIMIX_action_sleep(SIMIX_host_self(), -1);
   SIMIX_action_set_name(act_sleep,bprintf("Locked in semaphore %p", sem));
   /* Always create an action null in case there is a host failure */
   act_sleep = SIMIX_action_sleep(SIMIX_host_self(), -1);
   SIMIX_action_set_name(act_sleep,bprintf("Locked in semaphore %p", sem));
@@ -465,6 +474,7 @@ void SIMIX_sem_acquire(smx_sem_t sem) {
   SIMIX_unregister_action_to_semaphore(act_sleep, sem);
   SIMIX_action_destroy(act_sleep);
   DEBUG1("End of Wait on semaphore %p", sem);
   SIMIX_unregister_action_to_semaphore(act_sleep, sem);
   SIMIX_action_destroy(act_sleep);
   DEBUG1("End of Wait on semaphore %p", sem);
+  sem->capacity++;
 }
 /**
  * \brief Tries to acquire a semaphore before a timeout
 }
 /**
  * \brief Tries to acquire a semaphore before a timeout
@@ -486,6 +496,7 @@ void SIMIX_sem_acquire_timeout(smx_sem_t sem, double max_duration) {
   }
 
   if (max_duration >= 0) {
   }
 
   if (max_duration >= 0) {
+    sem->capacity--;
     act_sleep = SIMIX_action_sleep(SIMIX_host_self(), max_duration);
     SIMIX_action_set_name(act_sleep,bprintf("Timed wait semaphore %p (max_duration:%f)", sem,max_duration));
     SIMIX_register_action_to_semaphore(act_sleep, sem);
     act_sleep = SIMIX_action_sleep(SIMIX_host_self(), max_duration);
     SIMIX_action_set_name(act_sleep,bprintf("Timed wait semaphore %p (max_duration:%f)", sem,max_duration));
     SIMIX_register_action_to_semaphore(act_sleep, sem);
@@ -499,6 +510,7 @@ void SIMIX_sem_acquire_timeout(smx_sem_t sem, double max_duration) {
     } else {
       SIMIX_action_destroy(act_sleep);
     }
     } else {
       SIMIX_action_destroy(act_sleep);
     }
+    sem->capacity++;
 
   } else
     SIMIX_sem_acquire(sem);
 
   } else
     SIMIX_sem_acquire(sem);