Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Do not traverse the whole array of request to find non-null ones, use a heap instead
[simgrid.git] / src / simix / smx_smurf.c
index fd7514d..e358404 100644 (file)
@@ -5,29 +5,41 @@
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_smurf, simix,
                                 "Logging specific to SIMIX (SMURF)");
 
-static xbt_dynar_t req_vector;
-static xbt_os_mutex_t sync_req_vector;
+/* Array storing all requests to be handled in this scheduling round */
+static smx_req_t* req_vector=NULL;
+/* Positions of the previous array with non-null data */
+static xbt_heap_t req_positions;
+/* to protect the write actions in the heap */
+static xbt_os_mutex_t sync_req_positions;
 
 void SIMIX_request_init(void)
 {
-  sync_req_vector = xbt_os_mutex_init();
-  req_vector = xbt_dynar_new(sizeof(void *), NULL);
+  req_vector = xbt_new0(smx_req_t,1);/* enough room for maestro's requests */
+  req_positions = xbt_heap_new(5,NULL);
+  sync_req_positions = xbt_os_mutex_init();
 }
 
 void SIMIX_request_destroy(void)
 {
-  xbt_os_mutex_destroy(sync_req_vector);
-  xbt_dynar_free(&req_vector);
+  free(req_vector);
+  req_vector = NULL;
+  xbt_heap_free(req_positions);
+  xbt_os_mutex_destroy(sync_req_positions);
 }
 
 void SIMIX_request_push(smx_req_t req)
 {
   req->issuer = SIMIX_process_self();
   if (req->issuer != simix_global->maestro_process){
-    xbt_os_mutex_acquire(sync_req_vector);
-    xbt_dynar_set_as(req_vector, req->issuer->pid, smx_req_t, req);
-    xbt_os_mutex_release(sync_req_vector);
+    req_vector[req->issuer->pid] = req;
     req->issuer->request = req;
+
+    if (_surf_parallel_contexts)
+      xbt_os_mutex_acquire(sync_req_positions);
+    xbt_heap_push(req_positions,req,req->issuer->pid);
+    if (_surf_parallel_contexts)
+      xbt_os_mutex_release(sync_req_positions);
+
     DEBUG2("Yield process '%s' on request of type %d", req->issuer->name, req->call);
     SIMIX_process_yield();
   } else {
@@ -37,15 +49,7 @@ void SIMIX_request_push(smx_req_t req)
 
 smx_req_t SIMIX_request_pop(void)
 {
-  smx_req_t request = NULL;
-  xbt_os_mutex_acquire(sync_req_vector);
-  while (xbt_dynar_length(req_vector)){
-    request = xbt_dynar_pop_as(req_vector, smx_req_t);
-    if (request)
-      break;
-  }
-  xbt_os_mutex_release(sync_req_vector);
-  return request;
+  return xbt_heap_pop(req_positions);
 }
 
 void SIMIX_request_answer(smx_req_t req)
@@ -56,7 +60,7 @@ void SIMIX_request_answer(smx_req_t req)
   }
 }
 
-int SIMIX_request_isVisible(smx_req_t req)
+int SIMIX_request_is_visible(smx_req_t req)
 {
   return req->call == REQ_COMM_ISEND
      || req->call == REQ_COMM_IRECV
@@ -65,7 +69,7 @@ int SIMIX_request_isVisible(smx_req_t req)
      || req->call == REQ_COMM_TEST;
 }
 
-int SIMIX_request_isEnabled(smx_req_t req)
+int SIMIX_request_is_enabled(smx_req_t req)
 {
   unsigned int index = 0;
   smx_action_t act;
@@ -198,6 +202,7 @@ void SIMIX_request_pre(smx_req_t req)
       break;
 
     case REQ_PROCESS_CREATE:
+      req_vector = xbt_realloc(req_vector,sizeof(smx_req_t)*(SIMIX_process_get_maxpid()+2));
       req->process_create.result = SIMIX_process_create(
          req->process_create.name,
          req->process_create.code,
@@ -311,6 +316,7 @@ void SIMIX_request_pre(smx_req_t req)
          req->comm_isend.rate,
          req->comm_isend.src_buff,
          req->comm_isend.src_buff_size,
+         req->comm_isend.match_fun,
          req->comm_isend.data);
       SIMIX_request_answer(req);
       break;
@@ -320,7 +326,9 @@ void SIMIX_request_pre(smx_req_t req)
          req->issuer,
          req->comm_irecv.rdv,
          req->comm_irecv.dst_buff,
-         req->comm_irecv.dst_buff_size);
+         req->comm_irecv.dst_buff_size,
+         req->comm_irecv.match_fun,
+         req->comm_irecv.data);
       SIMIX_request_answer(req);
       break;
 
@@ -346,6 +354,10 @@ void SIMIX_request_pre(smx_req_t req)
       SIMIX_pre_comm_test(req);
       break;
 
+    case REQ_COMM_TESTANY:
+      SIMIX_pre_comm_testany(req);
+      break;
+
     case REQ_COMM_GET_REMAINS:
       req->comm_get_remains.result = 
         SIMIX_comm_get_remains(req->comm_get_remains.comm);
@@ -358,8 +370,13 @@ void SIMIX_request_pre(smx_req_t req)
       SIMIX_request_answer(req);
       break;
 
-    case REQ_COMM_GET_DATA:
-      req->comm_get_data.result = SIMIX_comm_get_data(req->comm_get_data.comm);
+    case REQ_COMM_GET_SRC_DATA:
+      req->comm_get_src_data.result = SIMIX_comm_get_src_data(req->comm_get_src_data.comm);
+      SIMIX_request_answer(req);
+      break;
+
+    case REQ_COMM_GET_DST_DATA:
+      req->comm_get_dst_data.result = SIMIX_comm_get_dst_data(req->comm_get_dst_data.comm);
       SIMIX_request_answer(req);
       break;
 
@@ -407,6 +424,15 @@ void SIMIX_request_pre(smx_req_t req)
       break;
 #endif
 
+#ifdef HAVE_TRACING
+    case REQ_SET_CATEGORY:
+      SIMIX_set_category(
+          req->set_category.action,
+          req->set_category.category);
+      SIMIX_request_answer(req);
+      break;
+#endif
+
     case REQ_MUTEX_INIT:
       req->mutex_init.result = SIMIX_mutex_init();
       SIMIX_request_answer(req);