From: Gabriel Corona Date: Mon, 2 Mar 2015 09:58:22 +0000 (+0100) Subject: [mc] Remote access to process name X-Git-Tag: v3_12~732^2~113 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/afb1729eae045359028c802a71475b1ae7dae507 [mc] Remote access to process name --- diff --git a/src/mc/mc_comm_determinism.c b/src/mc/mc_comm_determinism.c index ed68099c96..bba97cea9a 100644 --- a/src/mc/mc_comm_determinism.c +++ b/src/mc/mc_comm_determinism.c @@ -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 diff --git a/src/mc/mc_process.c b/src/mc/mc_process.c index e3f4eb8378..bf29cbb041 100644 --- a/src/mc/mc_process.c +++ b/src/mc/mc_process.c @@ -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; diff --git a/src/mc/mc_request.c b/src/mc/mc_request.c index 942fe9c412..9e5dcdbd41 100644 --- a/src/mc/mc_request.c +++ b/src/mc/mc_request.c @@ -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: diff --git a/src/mc/mc_smx.c b/src/mc/mc_smx.c index 1180faa8a3..2f8b8fc081 100644 --- a/src/mc/mc_smx.c +++ b/src/mc/mc_smx.c @@ -13,10 +13,23 @@ #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; +} diff --git a/src/mc/mc_smx.h b/src/mc/mc_smx.h index 363bd89092..733d63f962 100644 --- a/src/mc/mc_smx.h +++ b/src/mc/mc_smx.h @@ -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) \