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) {
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 =
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);
} 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:
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;
// 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);
}
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;
}
{
smx_synchro_t act;
+ // FIXME, remote access to comm object
+
switch (req->call) {
case SIMCALL_COMM_WAIT:
#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
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);
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;
}
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;
+}