Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Remote access to process name
authorGabriel Corona <gabriel.corona@loria.fr>
Mon, 2 Mar 2015 09:58:22 +0000 (10:58 +0100)
committerGabriel Corona <gabriel.corona@loria.fr>
Tue, 10 Mar 2015 09:55:04 +0000 (10:55 +0100)
src/mc/mc_comm_determinism.c
src/mc/mc_process.c
src/mc/mc_request.c
src/mc/mc_smx.c
src/mc/mc_smx.h

index ed68099..bba97ce 100644 (file)
@@ -241,6 +241,7 @@ void get_comm_pattern(const xbt_dynar_t list, const smx_simcall_t request, const
     /* Create comm pattern */
     pattern->type = SIMIX_COMM_SEND;
     pattern->comm = simcall_comm_isend__get__result(request);
+    // FIXME, remote access to rdv->name
     pattern->rdv = (pattern->comm->comm.rdv != NULL) ? strdup(pattern->comm->comm.rdv->name) : strdup(pattern->comm->comm.rdv_cpy->name);
     pattern->src_proc = pattern->comm->comm.src_proc->pid;
     // FIXME, get remote host name
index e3f4eb8..bf29cbb 100644 (file)
@@ -59,7 +59,7 @@ void MC_process_init(mc_process_t process, pid_t pid, int sockfd)
   process->process_flags = MC_PROCESS_NO_FLAG;
   process->socket = sockfd;
   process->pid = pid;
-  if (pid==getpid())
+  if (0 && pid==getpid())
     process->process_flags |= MC_PROCESS_SELF_FLAG;
   process->running = true;
   process->status = 0;
index 942fe9c..9e5dcdb 100644 (file)
@@ -236,9 +236,6 @@ char *MC_request_to_string(smx_simcall_t req, int value)
   smx_synchro_t act = NULL;
   size_t size = 0;
 
-  // FIXME, host_get_name
-  // FIXME, buffer access (issuer->name, issuer->smx_host)
-
   smx_process_t issuer = MC_smx_simcall_get_issuer(req);
 
   switch (req->call) {
@@ -249,12 +246,13 @@ char *MC_request_to_string(smx_simcall_t req, int value)
     if (issuer->smx_host)
       args =
           bprintf("src=(%lu)%s (%s), buff=%s, size=%s", issuer->pid,
-                  MC_smx_process_get_host_name(issuer), issuer->name,
+                  MC_smx_process_get_host_name(issuer),
+                  MC_smx_process_get_name(issuer),
                   p, bs);
     else
       args =
           bprintf("src=(%lu)%s, buff=%s, size=%s", issuer->pid,
-                  issuer->name, p, bs);
+                  MC_smx_process_get_name(issuer), p, bs);
     break;
   case SIMCALL_COMM_IRECV:
     size =
@@ -266,12 +264,14 @@ char *MC_request_to_string(smx_simcall_t req, int value)
     if (issuer->smx_host)
       args =
           bprintf("dst=(%lu)%s (%s), buff=%s, size=%s", issuer->pid,
-                  MC_smx_process_get_host_name(issuer), issuer->name,
+                  MC_smx_process_get_host_name(issuer),
+                  MC_smx_process_get_name(issuer),
                   p, bs);
     else
       args =
           bprintf("dst=(%lu)%s, buff=%s, size=%s", issuer->pid,
-                  issuer->name, p, bs);
+                  MC_smx_process_get_name(issuer),
+                  p, bs);
     break;
   case SIMCALL_COMM_WAIT:
     act = simcall_comm_wait__get__comm(req);
@@ -282,15 +282,16 @@ char *MC_request_to_string(smx_simcall_t req, int value)
     } else {
       type = xbt_strdup("Wait");
       p = pointer_to_string(act);
+      // TODO, fix remote access to comm
+      smx_process_t src_proc = MC_smx_resolve_process(act->comm.src_proc);
+      smx_process_t dst_proc = MC_smx_resolve_process(act->comm.dst_proc);
       args = bprintf("comm=%s [(%lu)%s (%s)-> (%lu)%s (%s)]", p,
-                     act->comm.src_proc ? act->comm.src_proc->pid : 0,
-                     // TODO, get process
-                     act->comm.src_proc ? MC_smx_process_get_host_name(MC_smx_resolve_process(act->comm.src_proc)) : "",
-                     act->comm.src_proc ? act->comm.src_proc->name : "",
-                     act->comm.dst_proc ? act->comm.dst_proc->pid : 0,
-                     // TOTO get process
-                     act->comm.dst_proc ? MC_smx_process_get_host_name(MC_smx_resolve_process(act->comm.dst_proc)) : "",
-                     act->comm.dst_proc ? act->comm.dst_proc->name : "");
+                     src_proc ? src_proc->pid : 0,
+                     src_proc ? MC_smx_process_get_host_name(src_proc) : "",
+                     src_proc ? MC_smx_process_get_name(src_proc) : "",
+                     dst_proc ? dst_proc->pid : 0,
+                     dst_proc ? MC_smx_process_get_host_name(dst_proc) : "",
+                     dst_proc ? MC_smx_process_get_name(dst_proc) : "");
     }
     break;
   case SIMCALL_COMM_TEST:
@@ -303,11 +304,15 @@ char *MC_request_to_string(smx_simcall_t req, int value)
       type = xbt_strdup("Test TRUE");
       p = pointer_to_string(act);
       // TODO, get process, get process name
+      smx_process_t src_proc = MC_smx_resolve_process(act->comm.src_proc);
+      smx_process_t dst_proc = MC_smx_resolve_process(act->comm.dst_proc);
       args = bprintf("comm=%s [(%lu)%s (%s) -> (%lu)%s (%s)]", p,
-                     act->comm.src_proc->pid, act->comm.src_proc->name,
-                     MC_smx_process_get_host_name(MC_smx_resolve_process(act->comm.src_proc)),
-                     act->comm.dst_proc->pid, act->comm.dst_proc->name,
-                     MC_smx_process_get_host_name(MC_smx_resolve_process(act->comm.dst_proc)));
+                     src_proc->pid,
+                     MC_smx_process_get_name(src_proc),
+                     MC_smx_process_get_host_name(src_proc),
+                     dst_proc->pid,
+                     MC_smx_process_get_name(dst_proc),
+                     MC_smx_process_get_host_name(dst_proc));
     }
     break;
 
@@ -360,13 +365,15 @@ char *MC_request_to_string(smx_simcall_t req, int value)
     // FIXME, get process name
     str =
         bprintf("[(%lu)%s (%s)] %s(%s)", issuer->pid,
-                MC_smx_process_get_host_name(issuer), issuer->name,
+                MC_smx_process_get_host_name(issuer),
+                MC_smx_process_get_name(issuer),
                 type, args);
   } else {
     // FIXME, get process name
     str =
         bprintf("[(%lu)%s (%s)] %s ", issuer->pid,
-                MC_smx_process_get_host_name(issuer), issuer->name,
+                MC_smx_process_get_host_name(issuer),
+                MC_smx_process_get_name(issuer),
                 type);
   }
 
@@ -383,6 +390,7 @@ unsigned int MC_request_testany_fail(smx_simcall_t req)
   smx_synchro_t action;
 
   xbt_dynar_foreach(simcall_comm_testany__get__comms(req), cursor, action) {
+    // FIXME, remote access to comm object
     if (action->comm.src_proc && action->comm.dst_proc)
       return FALSE;
   }
@@ -394,6 +402,8 @@ int MC_request_is_enabled_by_idx(smx_simcall_t req, unsigned int idx)
 {
   smx_synchro_t act;
 
+  // FIXME, remote access to comm object
+
   switch (req->call) {
 
   case SIMCALL_COMM_WAIT:
index 1180faa..2f8b8fc 100644 (file)
 #include "mc_smx.h"
 #include "mc_model_checker.h"
 
+static
+void MC_smx_process_info_clear(mc_smx_process_info_t p)
+{
+  p->hostname = NULL;
+
+  xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap);
+  free(p->name);
+  mmalloc_set_current_heap(heap);
+
+  p->name = NULL;
+}
+
 xbt_dynar_t MC_smx_process_info_list_new(void)
 {
   return xbt_dynar_new(
-    sizeof(s_mc_smx_process_info_t), NULL);
+    sizeof(s_mc_smx_process_info_t),
+    ( void_f_pvoid_t) &MC_smx_process_info_clear);
 }
 
 static inline
@@ -61,6 +74,7 @@ static void MC_process_refresh_simix_process_list(
 
     s_mc_smx_process_info_t info;
     info.address = p;
+    info.name = NULL;
     info.hostname = NULL;
     MC_process_read(process, MC_PROCESS_NO_FLAG,
       &info.copy, p, sizeof(info.copy), MC_PROCESS_INDEX_ANY);
@@ -134,6 +148,8 @@ smx_process_t MC_smx_simcall_get_issuer(smx_simcall_t req)
 
 smx_process_t MC_smx_resolve_process(smx_process_t process_remote_address)
 {
+  if (!process_remote_address)
+    return NULL;
   if (MC_process_is_self(&mc_model_checker->process))
     return process_remote_address;
 
@@ -194,3 +210,43 @@ const char* MC_smx_process_get_host_name(smx_process_t p)
   }
   return info->hostname;
 }
+
+const char* MC_smx_process_get_name(smx_process_t p)
+{
+  mc_process_t process = &mc_model_checker->process;
+  if (MC_process_is_self(process))
+    return p->name;
+  if (!p->name)
+    return NULL;
+
+  mc_smx_process_info_t info = MC_smx_process_get_info(p);
+  if (!info->name) {
+    size_t size = 128;
+    char buffer[size];
+
+    size_t off = 0;
+    while (1) {
+      ssize_t n = pread(process->memory_file, buffer+off, size-off, (off_t)p->name + off);
+      if (n==-1) {
+        if (errno == EINTR)
+          continue;
+        else {
+          perror("MC_smx_process_get_name");
+          xbt_die("Could not read memory");
+        }
+      }
+      if (n==0)
+        return "?";
+      void* end = memchr(buffer+off, '\0', n);
+      if (end)
+        break;
+      off += n;
+      if (off == size)
+        return "?";
+    }
+    xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap);
+    info->name = strdup(buffer);
+    mmalloc_set_current_heap(heap);
+  }
+  return info->name;
+}
index 363bd89..733d63f 100644 (file)
@@ -44,6 +44,7 @@ struct s_mc_smx_process_info {
   struct s_smx_process copy;
   /** Hostname (owned by `mc_modelchecker->hostnames`) */
   char* hostname;
+  char* name;
 };
 
 xbt_dynar_t MC_smx_process_info_list_new(void);
@@ -61,6 +62,7 @@ void MC_process_smx_refresh(mc_process_t process);
  */
 smx_process_t MC_smx_simcall_get_issuer(smx_simcall_t req);
 
+const char* MC_smx_process_get_name(smx_process_t p);
 const char* MC_smx_process_get_host_name(smx_process_t p);
 
 #define MC_EACH_SIMIX_PROCESS(process, code) \