コード例 #1
0
ファイル: mc_request.cpp プロジェクト: adegomme/simgrid
char *request_get_dot_output(smx_simcall_t req, int value)
{
  char *label = nullptr;

  const smx_process_t issuer = MC_smx_simcall_get_issuer(req);

  switch (req->call) {
  case SIMCALL_COMM_ISEND:
    if (issuer->host)
      label =
          bprintf("[(%lu)%s] iSend", issuer->pid,
                  MC_smx_process_get_host_name(issuer));
    else
      label = bprintf("[(%lu)] iSend", issuer->pid);
    break;

  case SIMCALL_COMM_IRECV:
    if (issuer->host)
      label =
          bprintf("[(%lu)%s] iRecv", issuer->pid,
                  MC_smx_process_get_host_name(issuer));
    else
      label = bprintf("[(%lu)] iRecv", issuer->pid);
    break;

  case SIMCALL_COMM_WAIT: {
    if (value == -1) {
      if (issuer->host)
        label =
            bprintf("[(%lu)%s] WaitTimeout", issuer->pid,
                    MC_smx_process_get_host_name(issuer));
      else
        label = bprintf("[(%lu)] WaitTimeout", issuer->pid);
    } else {
      smx_synchro_t remote_act = simcall_comm_wait__get__comm(req);
      s_smx_synchro_t synchro;
      mc_model_checker->process().read_bytes(&synchro,
        sizeof(synchro), remote(remote_act));

      smx_process_t src_proc = MC_smx_resolve_process(synchro.comm.src_proc);
      smx_process_t dst_proc = MC_smx_resolve_process(synchro.comm.dst_proc);
      if (issuer->host)
        label =
            bprintf("[(%lu)%s] Wait [(%lu)->(%lu)]", issuer->pid,
                    MC_smx_process_get_host_name(issuer),
                    src_proc ? src_proc->pid : 0,
                    dst_proc ? dst_proc->pid : 0);
      else
        label =
            bprintf("[(%lu)] Wait [(%lu)->(%lu)]", issuer->pid,
                    src_proc ? src_proc->pid : 0,
                    dst_proc ? dst_proc->pid : 0);
    }
    break;
  }

  case SIMCALL_COMM_TEST: {
    smx_synchro_t remote_act = simcall_comm_test__get__comm(req);
    s_smx_synchro_t synchro;
    mc_model_checker->process().read_bytes(&synchro,
      sizeof(synchro), remote(remote_act));
    if (synchro.comm.src_proc == nullptr || synchro.comm.dst_proc == NULL) {
      if (issuer->host)
        label =
            bprintf("[(%lu)%s] Test FALSE", issuer->pid,
                    MC_smx_process_get_host_name(issuer));
      else
        label = bprintf("[(%lu)] Test FALSE", issuer->pid);
    } else {
      if (issuer->host)
        label =
            bprintf("[(%lu)%s] Test TRUE", issuer->pid,
                    MC_smx_process_get_host_name(issuer));
      else
        label = bprintf("[(%lu)] Test TRUE", issuer->pid);
    }
    break;
  }

  case SIMCALL_COMM_WAITANY: {
    unsigned long comms_size = read_length(
      mc_model_checker->process(), remote(simcall_comm_waitany__get__comms(req)));
    if (issuer->host)
      label =
          bprintf("[(%lu)%s] WaitAny [%d of %lu]", issuer->pid,
                  MC_smx_process_get_host_name(issuer), value + 1,
                  comms_size);
    else
      label =
          bprintf("[(%lu)] WaitAny [%d of %lu]", issuer->pid, value + 1,
                  comms_size);
    break;
  }

  case SIMCALL_COMM_TESTANY:
    if (value == -1) {
      if (issuer->host)
        label =
            bprintf("[(%lu)%s] TestAny FALSE", issuer->pid,
                    MC_smx_process_get_host_name(issuer));
      else
        label = bprintf("[(%lu)] TestAny FALSE", issuer->pid);
    } else {
      if (issuer->host)
        label =
            bprintf("[(%lu)%s] TestAny TRUE [%d of %lu]", issuer->pid,
                    MC_smx_process_get_host_name(issuer), value + 1,
                    xbt_dynar_length(simcall_comm_testany__get__comms(req)));
      else
        label =
            bprintf("[(%lu)] TestAny TRUE [%d of %lu]", issuer->pid,
                    value + 1,
                    xbt_dynar_length(simcall_comm_testany__get__comms(req)));
    }
    break;

  case SIMCALL_MUTEX_TRYLOCK:
    label = bprintf("[(%lu)] Mutex TRYLOCK", issuer->pid);
    break;

  case SIMCALL_MUTEX_LOCK:
    label = bprintf("[(%lu)] Mutex LOCK", issuer->pid);
    break;

  case SIMCALL_MC_RANDOM:
    if (issuer->host)
      label =
          bprintf("[(%lu)%s] MC_RANDOM (%d)", issuer->pid,
                  MC_smx_process_get_host_name(issuer), value);
    else
      label = bprintf("[(%lu)] MC_RANDOM (%d)", issuer->pid, value);
    break;

  default:
    THROW_UNIMPLEMENTED;
  }

  char* str =
      bprintf("label = \"%s\", color = %s, fontcolor = %s", label,
              colors[issuer->pid - 1], colors[issuer->pid - 1]);
  xbt_free(label);
  return str;

}
コード例 #2
0
ファイル: mc_request.cpp プロジェクト: fabienchaix/simgrid
std::string request_get_dot_output(smx_simcall_t req, int value)
{
  std::string label;

  const smx_actor_t issuer = MC_smx_simcall_get_issuer(req);

  switch (req->call) {
  case SIMCALL_COMM_ISEND:
    if (issuer->host)
      label = simgrid::xbt::string_printf("[(%lu)%s] iSend", issuer->pid,
                  MC_smx_process_get_host_name(issuer));
    else
      label = bprintf("[(%lu)] iSend", issuer->pid);
    break;

  case SIMCALL_COMM_IRECV:
    if (issuer->host)
      label = simgrid::xbt::string_printf("[(%lu)%s] iRecv", issuer->pid,
                  MC_smx_process_get_host_name(issuer));
    else
      label = simgrid::xbt::string_printf("[(%lu)] iRecv", issuer->pid);
    break;

  case SIMCALL_COMM_WAIT: {
    if (value == -1) {
      if (issuer->host)
        label = simgrid::xbt::string_printf("[(%lu)%s] WaitTimeout", issuer->pid,
                    MC_smx_process_get_host_name(issuer));
      else
        label = simgrid::xbt::string_printf("[(%lu)] WaitTimeout", issuer->pid);
    } else {
      smx_activity_t remote_act = simcall_comm_wait__get__comm(req);
      simgrid::mc::Remote<simgrid::kernel::activity::Comm> temp_comm;
      mc_model_checker->process().read(temp_comm, remote(
        static_cast<simgrid::kernel::activity::Comm*>(remote_act)));
      simgrid::kernel::activity::Comm* comm = temp_comm.getBuffer();

      smx_actor_t src_proc = mc_model_checker->process().resolveProcess(
        simgrid::mc::remote(comm->src_proc));
      smx_actor_t dst_proc = mc_model_checker->process().resolveProcess(
        simgrid::mc::remote(comm->dst_proc));
      if (issuer->host)
        label = simgrid::xbt::string_printf("[(%lu)%s] Wait [(%lu)->(%lu)]",
                    issuer->pid,
                    MC_smx_process_get_host_name(issuer),
                    src_proc ? src_proc->pid : 0,
                    dst_proc ? dst_proc->pid : 0);
      else
        label = simgrid::xbt::string_printf("[(%lu)] Wait [(%lu)->(%lu)]",
                    issuer->pid,
                    src_proc ? src_proc->pid : 0,
                    dst_proc ? dst_proc->pid : 0);
    }
    break;
  }

  case SIMCALL_COMM_TEST: {
    smx_activity_t remote_act = simcall_comm_test__get__comm(req);
    simgrid::mc::Remote<simgrid::kernel::activity::Comm> temp_comm;
    mc_model_checker->process().read(temp_comm, remote(
      static_cast<simgrid::kernel::activity::Comm*>(remote_act)));
    simgrid::kernel::activity::Comm* comm = temp_comm.getBuffer();
    if (comm->src_proc == nullptr || comm->dst_proc == nullptr) {
      if (issuer->host)
        label = simgrid::xbt::string_printf("[(%lu)%s] Test FALSE",
                    issuer->pid,
                    MC_smx_process_get_host_name(issuer));
      else
        label = bprintf("[(%lu)] Test FALSE", issuer->pid);
    } else {
      if (issuer->host)
        label = simgrid::xbt::string_printf("[(%lu)%s] Test TRUE", issuer->pid,
                    MC_smx_process_get_host_name(issuer));
      else
        label = simgrid::xbt::string_printf("[(%lu)] Test TRUE", issuer->pid);
    }
    break;
  }

  case SIMCALL_COMM_WAITANY: {
    unsigned long comms_size = read_length(
      mc_model_checker->process(), remote(simcall_comm_waitany__get__comms(req)));
    if (issuer->host)
      label = simgrid::xbt::string_printf("[(%lu)%s] WaitAny [%d of %lu]",
                  issuer->pid,
                  MC_smx_process_get_host_name(issuer), value + 1,
                  comms_size);
    else
      label = simgrid::xbt::string_printf("[(%lu)] WaitAny [%d of %lu]",
                  issuer->pid, value + 1, comms_size);
    break;
  }

  case SIMCALL_COMM_TESTANY:
    if (value == -1) {
      if (issuer->host)
        label = simgrid::xbt::string_printf("[(%lu)%s] TestAny FALSE",
                    issuer->pid, MC_smx_process_get_host_name(issuer));
      else
        label = simgrid::xbt::string_printf("[(%lu)] TestAny FALSE", issuer->pid);
    } else {
      if (issuer->host)
        label = simgrid::xbt::string_printf("[(%lu)%s] TestAny TRUE [%d of %lu]",
                    issuer->pid,
                    MC_smx_process_get_host_name(issuer), value + 1,
                    simcall_comm_testany__get__count(req));
      else
        label = simgrid::xbt::string_printf("[(%lu)] TestAny TRUE [%d of %lu]",
                    issuer->pid,
                    value + 1,
                    simcall_comm_testany__get__count(req));
    }
    break;

  case SIMCALL_MUTEX_TRYLOCK:
    label = simgrid::xbt::string_printf("[(%lu)] Mutex TRYLOCK", issuer->pid);
    break;

  case SIMCALL_MUTEX_LOCK:
    label = simgrid::xbt::string_printf("[(%lu)] Mutex LOCK", issuer->pid);
    break;

  case SIMCALL_MC_RANDOM:
    if (issuer->host)
      label = simgrid::xbt::string_printf("[(%lu)%s] MC_RANDOM (%d)",
                  issuer->pid, MC_smx_process_get_host_name(issuer), value);
    else
      label = simgrid::xbt::string_printf("[(%lu)] MC_RANDOM (%d)", issuer->pid, value);
    break;

  default:
    THROW_UNIMPLEMENTED;
  }

  const char* color = get_color(issuer->pid - 1);
  return  simgrid::xbt::string_printf(
        "label = \"%s\", color = %s, fontcolor = %s", label.c_str(),
        color, color);
}