#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) {
+ xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap);
+ info->name = MC_process_read_string(process, p->name);
+ mmalloc_set_current_heap(heap);
+ }
+ return info->name;
+}
+
+int MC_smpi_process_count(void)
+{
+ if (MC_process_is_self(&mc_model_checker->process))
+ return smpi_process_count();
+ else {
+ int res;
+ MC_process_read_variable(&mc_model_checker->process, "process_count",
+ &res, sizeof(res));
+ return res;
+ }
+}