Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
merge conflict resolved
authorMarion Guthmuller <marion.guthmuller@loria.fr>
Mon, 30 Jan 2012 12:44:30 +0000 (13:44 +0100)
committerMarion Guthmuller <marion.guthmuller@loria.fr>
Mon, 30 Jan 2012 12:44:30 +0000 (13:44 +0100)
examples/msg/chord/CMakeLists.txt
examples/msg/chord/chord_stateful.c [deleted file]
include/simix/simix.h
include/xbt/mmalloc.h
src/mc/mc_checkpoint.c
src/mc/mc_liveness.c
src/mc/private.h
src/simix/smx_network.c
src/xbt/mmalloc/mm_legacy.c
src/xbt/mmalloc/mmprivate.h

index 91c86c5..cc0096d 100644 (file)
@@ -3,8 +3,6 @@ cmake_minimum_required(VERSION 2.6)
 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
 
 add_executable(chord "chord.c")
-add_executable(chord_stateful "chord_stateful.c")
 
 ### Add definitions for compile
 target_link_libraries(chord simgrid )
-target_link_libraries(chord_stateful simgrid)
diff --git a/examples/msg/chord/chord_stateful.c b/examples/msg/chord/chord_stateful.c
deleted file mode 100644 (file)
index 57fd00a..0000000
+++ /dev/null
@@ -1,946 +0,0 @@
-
-/* Copyright (c) 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <stdio.h>
-#include "msg/msg.h"
-#include "xbt/log.h"
-#include "xbt/asserts.h"
-#include "mc/modelchecker.h"
-#include "mc/mc.h"
-#include "xbt/xbt_os_time.h"
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(msg_chord,
-                             "Messages specific for this msg example");
-
-#define COMM_SIZE 10
-#define COMP_SIZE 0
-#define MAILBOX_NAME_SIZE 10
-
-static int nb_bits = 24;
-static int nb_keys = 0;
-static int timeout = 50;
-static int max_simulation_time = 1000;
-static int periodic_stabilize_delay = 20;
-static int periodic_fix_fingers_delay = 120;
-static int periodic_check_predecessor_delay = 120;
-static int periodic_lookup_delay = 10;
-
-extern long int smx_total_comms;
-
-/**
- * Finger element.
- */
-typedef struct finger {
-  int id;
-  char mailbox[MAILBOX_NAME_SIZE]; // string representation of the id
-} s_finger_t, *finger_t;
-
-/**
- * Node data.
- */
-typedef struct node {
-  int id;                                 // my id
-  char mailbox[MAILBOX_NAME_SIZE];        // my mailbox name (string representation of the id)
-  s_finger_t *fingers;                    // finger table, of size nb_bits (fingers[0] is my successor)
-  int pred_id;                            // predecessor id
-  char pred_mailbox[MAILBOX_NAME_SIZE];   // predecessor's mailbox name
-  int next_finger_to_fix;                 // index of the next finger to fix in fix_fingers()
-  msg_comm_t comm_receive;                // current communication to receive
-  double last_change_date;                // last time I changed a finger or my predecessor
-} s_node_t, *node_t;
-
-/**
- * Types of tasks exchanged between nodes.
- */
-typedef enum {
-  TASK_FIND_SUCCESSOR,
-  TASK_FIND_SUCCESSOR_ANSWER,
-  TASK_GET_PREDECESSOR,
-  TASK_GET_PREDECESSOR_ANSWER,
-  TASK_NOTIFY,
-  TASK_SUCCESSOR_LEAVING,
-  TASK_PREDECESSOR_LEAVING
-} e_task_type_t;
-
-/**
- * Data attached with the tasks sent and received
- */
-typedef struct task_data {
-  e_task_type_t type;                     // type of task
-  int request_id;                         // id paramater (used by some types of tasks)
-  int request_finger;                     // finger parameter (used by some types of tasks)
-  int answer_id;                          // answer (used by some types of tasks)
-  char answer_to[MAILBOX_NAME_SIZE];      // mailbox to send an answer to (if any)
-  const char* issuer_host_name;           // used for logging
-} s_task_data_t, *task_data_t;
-
-static int *powers2;
-
-// utility functions
-static void chord_initialize(void);
-static int normalize(int id);
-static int is_in_interval(int id, int start, int end);
-static void get_mailbox(int host_id, char* mailbox);
-static void task_free(void* task);
-static void print_finger_table(node_t node);
-static void set_finger(node_t node, int finger_index, int id);
-static void set_predecessor(node_t node, int predecessor_id);
-
-// process functions
-static int node(int argc, char *argv[]);
-static void handle_task(node_t node, m_task_t task);
-
-// Chord core
-static void create(node_t node);
-static int join(node_t node, int known_id);
-static void leave(node_t node);
-static int find_successor(node_t node, int id);
-static int remote_find_successor(node_t node, int ask_to_id, int id);
-static int remote_get_predecessor(node_t node, int ask_to_id);
-static int closest_preceding_node(node_t node, int id);
-static void stabilize(node_t node);
-static void notify(node_t node, int predecessor_candidate_id);
-static void remote_notify(node_t node, int notify_to, int predecessor_candidate_id);
-static void fix_fingers(node_t node);
-static void check_predecessor(node_t node);
-static void random_lookup(node_t);
-static void quit_notify(node_t node, int to);
-
-/**
- * \brief Global initialization of the Chord simulation.
- */
-static void chord_initialize(void)
-{
-  // compute the powers of 2 once for all
-  powers2 = xbt_new(int, nb_bits);
-  int pow = 1;
-  int i;
-  for (i = 0; i < nb_bits; i++) {
-    powers2[i] = pow;
-    pow = pow << 1;
-  }
-  nb_keys = pow;
-  XBT_DEBUG("Sets nb_keys to %d", nb_keys);
-}
-
-/**
- * \brief Turns an id into an equivalent id in [0, nb_keys).
- * \param id an id
- * \return the corresponding normalized id
- */
-static int normalize(int id)
-{
-  // like id % nb_keys, but works with negatives numbers (and faster)
-  return id & (nb_keys - 1);
-}
-
-/**
- * \brief Returns whether a id belongs to the interval [start, end].
- *
- * The parameters are noramlized to make sure they are between 0 and nb_keys - 1).
- * 1 belongs to [62, 3]
- * 1 does not belong to [3, 62]
- * 63 belongs to [62, 3]
- * 63 does not belong to [3, 62]
- * 24 belongs to [21, 29]
- * 24 does not belong to [29, 21]
- *
- * \param id id to check
- * \param start lower bound
- * \param end upper bound
- * \return a non-zero value if id in in [start, end]
- */
-static int is_in_interval(int id, int start, int end)
-{
-  id = normalize(id);
-  start = normalize(start);
-  end = normalize(end);
-
-  // make sure end >= start and id >= start
-  if (end < start) {
-    end += nb_keys;
-  }
-
-  if (id < start) {
-    id += nb_keys;
-  }
-
-  return id <= end;
-}
-
-/**
- * \brief Gets the mailbox name of a host given its chord id.
- * \param node_id id of a node
- * \param mailbox pointer to where the mailbox name should be written
- * (there must be enough space)
- */
-static void get_mailbox(int node_id, char* mailbox)
-{
-  snprintf(mailbox, MAILBOX_NAME_SIZE - 1, "%d", node_id);
-}
-
-/**
- * \brief Frees the memory used by a task.
- * \param task the MSG task to destroy
- */
-static void task_free(void* task)
-{
-  // TODO add a parameter data_free_function to MSG_task_create?
-  xbt_free(MSG_task_get_data(task));
-  MSG_task_destroy(task);
-}
-
-/**
- * \brief Displays the finger table of a node.
- * \param node a node
- */
-static void print_finger_table(node_t node)
-{
-  if (XBT_LOG_ISENABLED(msg_chord, xbt_log_priority_verbose)) {
-    int i;
-    XBT_VERB("My finger table:");
-    XBT_VERB("Start | Succ ");
-    for (i = 0; i < nb_bits; i++) {
-      XBT_VERB(" %3d  | %3d ", (node->id + powers2[i]) % nb_keys, node->fingers[i].id);
-    }
-    XBT_VERB("Predecessor: %d", node->pred_id);
-  }
-}
-
-/**
- * \brief Sets a finger of the current node.
- * \param node the current node
- * \param finger_index index of the finger to set (0 to nb_bits - 1)
- * \param id the id to set for this finger
- */
-static void set_finger(node_t node, int finger_index, int id)
-{
-  if (id != node->fingers[finger_index].id) {
-    node->fingers[finger_index].id = id;
-    get_mailbox(id, node->fingers[finger_index].mailbox);
-    node->last_change_date = MSG_get_clock();
-    XBT_DEBUG("My new finger #%d is %d", finger_index, id);
-  }
-}
-
-/**
- * \brief Sets the predecessor of the current node.
- * \param node the current node
- * \param id the id to predecessor, or -1 to unset the predecessor
- */
-static void set_predecessor(node_t node, int predecessor_id)
-{
-  if (predecessor_id != node->pred_id) {
-    node->pred_id = predecessor_id;
-
-    if (predecessor_id != -1) {
-      get_mailbox(predecessor_id, node->pred_mailbox);
-    }
-    node->last_change_date = MSG_get_clock();
-
-    XBT_DEBUG("My new predecessor is %d", predecessor_id);
-  }
-}
-
-/**
- * \brief Node Function
- * Arguments:
- * - my id
- * - the id of a guy I know in the system (except for the first node)
- * - the time to sleep before I join (except for the first node)
- */
-int node(int argc, char *argv[])
-{
-  /* Reduce the run size for the MC */
-  if(MC_IS_ENABLED){
-    periodic_stabilize_delay = 8;
-    periodic_fix_fingers_delay = 8;
-    periodic_check_predecessor_delay = 8;
-  }
-
-  double init_time = MSG_get_clock();
-  m_task_t task_received = NULL;
-  int i;
-  int join_success = 0;
-  double deadline;
-  double next_stabilize_date = init_time + periodic_stabilize_delay;
-  double next_fix_fingers_date = init_time + periodic_fix_fingers_delay;
-  double next_check_predecessor_date = init_time + periodic_check_predecessor_delay;
-  double next_lookup_date = init_time + periodic_lookup_delay;
-
-  xbt_assert(argc == 3 || argc == 5, "Wrong number of arguments for this node");
-
-  // initialize my node
-  s_node_t node = {0};
-  node.id = atoi(argv[1]);
-  get_mailbox(node.id, node.mailbox);
-  node.next_finger_to_fix = 0;
-  node.fingers = xbt_new0(s_finger_t, nb_bits);
-  node.last_change_date = init_time;
-
-  for (i = 0; i < nb_bits; i++) {
-    node.fingers[i].id = -1;
-    set_finger(&node, i, node.id);
-  }
-
-  if (argc == 3) { // first ring
-    deadline = atof(argv[2]);
-    create(&node);
-    join_success = 1;
-  }
-  else {
-    int known_id = atoi(argv[2]);
-    //double sleep_time = atof(argv[3]);
-    deadline = atof(argv[4]);
-
-    /*
-    // sleep before starting
-    XBT_DEBUG("Let's sleep during %f", sleep_time);
-    MSG_process_sleep(sleep_time);
-    */
-    XBT_DEBUG("Hey! Let's join the system.");
-
-    join_success = join(&node, known_id);
-  }
-
-  if (join_success) {
-    while (MSG_get_clock() < init_time + deadline
-//     && MSG_get_clock() < node.last_change_date + 1000
-       && MSG_get_clock() < max_simulation_time) {
-
-      if (node.comm_receive == NULL) {
-        task_received = NULL;
-        node.comm_receive = MSG_task_irecv(&task_received, node.mailbox);
-        // FIXME: do not make MSG_task_irecv() calls from several functions
-      }
-
-      if (!MSG_comm_test(node.comm_receive)) {
-
-        // no task was received: make some periodic calls
-        if (MSG_get_clock() >= next_stabilize_date) {
-          stabilize(&node);
-          next_stabilize_date = MSG_get_clock() + periodic_stabilize_delay;
-        }
-        else if (MSG_get_clock() >= next_fix_fingers_date) {
-          fix_fingers(&node);
-          next_fix_fingers_date = MSG_get_clock() + periodic_fix_fingers_delay;
-        }
-        else if (MSG_get_clock() >= next_check_predecessor_date) {
-          check_predecessor(&node);
-          next_check_predecessor_date = MSG_get_clock() + periodic_check_predecessor_delay;
-        }
-       else if (MSG_get_clock() >= next_lookup_date) {
-         random_lookup(&node);
-         next_lookup_date = MSG_get_clock() + periodic_lookup_delay;
-       }
-        else {
-          // nothing to do: sleep for a while
-          MSG_process_sleep(5);
-        }
-      }
-      else {
-        // a transfer has occured
-
-        MSG_error_t status = MSG_comm_get_status(node.comm_receive);
-
-        if (status != MSG_OK) {
-          XBT_DEBUG("Failed to receive a task. Nevermind.");
-          node.comm_receive = NULL;
-        }
-        else {
-          // the task was successfully received
-          MSG_comm_destroy(node.comm_receive);
-          node.comm_receive = NULL;
-          handle_task(&node, task_received);
-        }
-      }
-
-      // see if some communications are finished
-      /*
-      while ((index = MSG_comm_testany(node.comms)) != -1) {
-        comm_send = xbt_dynar_get_as(node.comms, index, msg_comm_t);
-        MSG_error_t status = MSG_comm_get_status(comm_send);
-        xbt_dynar_remove_at(node.comms, index, &comm_send);
-        XBT_DEBUG("Communication %p is finished with status %d, dynar size is now %lu",
-            comm_send, status, xbt_dynar_length(node.comms));
-       m_task_t task = MSG_comm_get_task(comm_send);
-        MSG_comm_destroy(comm_send);
-       if (status != MSG_OK) {
-         task_data_destroy(MSG_task_get_data(task));
-         MSG_task_destroy(task);
-       }
-      }
-      */
-    }
-
-    // clean unfinished comms sent
-   /* unsigned int cursor;
-    xbt_dynar_foreach(node.comms, cursor, comm_send) {
-      m_task_t task = MSG_comm_get_task(comm_send);
-      MSG_task_cancel(task);
-      task_data_destroy(MSG_task_get_data(task));
-      MSG_task_destroy(task);
-      MSG_comm_destroy(comm_send);
-      // FIXME: the task is actually not destroyed because MSG thinks that the other side (whose process is dead) is still using it
-    }*/
-
-    // leave the ring
-    leave(&node);
-  }
-
-  // stop the simulation
-  xbt_free(node.fingers);
-  return 0;
-}
-
-/**
- * \brief This function is called when the current node receives a task.
- * \param node the current node
- * \param task the task to handle (don't touch it then:
- * it will be destroyed, reused or forwarded)
- */
-static void handle_task(node_t node, m_task_t task) {
-
-  XBT_DEBUG("Handling task %p", task);
-  char mailbox[MAILBOX_NAME_SIZE];
-  task_data_t task_data = (task_data_t) MSG_task_get_data(task);
-  e_task_type_t type = task_data->type;
-
-  switch (type) {
-
-    case TASK_FIND_SUCCESSOR:
-      XBT_DEBUG("Receiving a 'Find Successor' request from %s for id %d",
-          task_data->issuer_host_name, task_data->request_id);
-      // is my successor the successor?
-      if (is_in_interval(task_data->request_id, node->id + 1, node->fingers[0].id)) {
-        task_data->type = TASK_FIND_SUCCESSOR_ANSWER;
-        task_data->answer_id = node->fingers[0].id;
-        XBT_DEBUG("Sending back a 'Find Successor Answer' to %s (mailbox %s): the successor of %d is %d",
-            task_data->issuer_host_name,
-           task_data->answer_to,
-            task_data->request_id, task_data->answer_id);
-        MSG_task_dsend(task, task_data->answer_to, task_free);
-      }
-      else {
-        // otherwise, forward the request to the closest preceding finger in my table
-        int closest = closest_preceding_node(node, task_data->request_id);
-        XBT_DEBUG("Forwarding the 'Find Successor' request for id %d to my closest preceding finger %d",
-            task_data->request_id, closest);
-        get_mailbox(closest, mailbox);
-        MSG_task_dsend(task, mailbox, task_free);
-      }
-      break;
-
-    case TASK_GET_PREDECESSOR:
-      XBT_DEBUG("Receiving a 'Get Predecessor' request from %s", task_data->issuer_host_name);
-      task_data->type = TASK_GET_PREDECESSOR_ANSWER;
-      task_data->answer_id = node->pred_id;
-      XBT_DEBUG("Sending back a 'Get Predecessor Answer' to %s via mailbox '%s': my predecessor is %d",
-          task_data->issuer_host_name,
-          task_data->answer_to, task_data->answer_id);
-      MSG_task_dsend(task, task_data->answer_to, task_free);
-      break;
-
-    case TASK_NOTIFY:
-      // someone is telling me that he may be my new predecessor
-      XBT_DEBUG("Receiving a 'Notify' request from %s", task_data->issuer_host_name);
-      notify(node, task_data->request_id);
-      task_free(task);
-      break;
-
-    case TASK_PREDECESSOR_LEAVING:
-      // my predecessor is about to quit
-      XBT_DEBUG("Receiving a 'Predecessor Leaving' message from %s", task_data->issuer_host_name);
-      // modify my predecessor
-      set_predecessor(node, task_data->request_id);
-      task_free(task);
-      /*TODO :
-      >> notify my new predecessor
-      >> send a notify_predecessors !!
-       */
-      break;
-
-    case TASK_SUCCESSOR_LEAVING:
-      // my successor is about to quit
-      XBT_DEBUG("Receiving a 'Successor Leaving' message from %s", task_data->issuer_host_name);
-      // modify my successor FIXME : this should be implicit ?
-      set_finger(node, 0, task_data->request_id);
-      task_free(task);
-      /* TODO
-      >> notify my new successor
-      >> update my table & predecessors table */
-      break;
-
-    case TASK_FIND_SUCCESSOR_ANSWER:
-    case TASK_GET_PREDECESSOR_ANSWER:
-      XBT_DEBUG("Ignoring unexpected task of type %d (%p)", type, task);
-      task_free(task);
-      break;
-  }
-}
-
-/**
- * \brief Initializes the current node as the first one of the system.
- * \param node the current node
- */
-static void create(node_t node)
-{
-  XBT_DEBUG("Create a new Chord ring...");
-  set_predecessor(node, -1); // -1 means that I have no predecessor
-  print_finger_table(node);
-}
-
-/**
- * \brief Makes the current node join the ring, knowing the id of a node
- * already in the ring
- * \param node the current node
- * \param known_id id of a node already in the ring
- * \return 1 if the join operation succeeded, 0 otherwise
- */
-static int join(node_t node, int known_id)
-{
-  XBT_INFO("Joining the ring with id %d, knowing node %d", node->id, known_id);
-  set_predecessor(node, -1); // no predecessor (yet)
-
-  /*
-  int i;
-  for (i = 0; i < nb_bits; i++) {
-    set_finger(node, i, known_id);
-  }
-  */
-
-  int successor_id = remote_find_successor(node, known_id, node->id);
-  if (successor_id == -1) {
-    XBT_INFO("Cannot join the ring.");
-  }
-  else {
-    set_finger(node, 0, successor_id);
-    print_finger_table(node);
-  }
-
-  return successor_id != -1;
-}
-
-/**
- * \brief Makes the current node quit the system
- * \param node the current node
- */
-static void leave(node_t node)
-{
-  XBT_DEBUG("Well Guys! I Think it's time for me to quit ;)");
-  quit_notify(node, 1);  // notify to my successor ( >>> 1 );
-  quit_notify(node, -1); // notify my predecessor  ( >>> -1);
-  // TODO ...
-}
-
-/*
- * \brief Notifies the successor or the predecessor of the current node
- * of the departure
- * \param node the current node
- * \param to 1 to notify the successor, -1 to notify the predecessor
- * FIXME: notify both nodes with only one call
- */
-static void quit_notify(node_t node, int to)
-{
-  /* TODO
-  task_data_t req_data = xbt_new0(s_task_data_t, 1);
-  req_data->request_id = node->id;
-  req_data->successor_id = node->fingers[0].id;
-  req_data->pred_id = node->pred_id;
-  req_data->issuer_host_name = MSG_host_get_name(MSG_host_self());
-  req_data->answer_to = NULL;
-  const char* task_name = NULL;
-  const char* to_mailbox = NULL;
-  if (to == 1) {    // notify my successor
-    to_mailbox = node->fingers[0].mailbox;
-    XBT_INFO("Telling my Successor %d about my departure via mailbox %s",
-         node->fingers[0].id, to_mailbox);
-    req_data->type = TASK_PREDECESSOR_LEAVING;
-  }
-  else if (to == -1) {    // notify my predecessor
-
-    if (node->pred_id == -1) {
-      return;
-    }
-
-    to_mailbox = node->pred_mailbox;
-    XBT_INFO("Telling my Predecessor %d about my departure via mailbox %s",
-         node->pred_id, to_mailbox);
-    req_data->type = TASK_SUCCESSOR_LEAVING;
-  }
-  m_task_t task = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data);
-  //char* mailbox = get_mailbox(to_mailbox);
-  msg_comm_t comm = MSG_task_isend(task, to_mailbox);
-  xbt_dynar_push(node->comms, &comm);
-  */
-}
-
-/**
- * \brief Makes the current node find the successor node of an id.
- * \param node the current node
- * \param id the id to find
- * \return the id of the successor node, or -1 if the request failed
- */
-static int find_successor(node_t node, int id)
-{
-  // is my successor the successor?
-  if (is_in_interval(id, node->id + 1, node->fingers[0].id)) {
-    return node->fingers[0].id;
-  }
-
-  // otherwise, ask the closest preceding finger in my table
-  int closest = closest_preceding_node(node, id);
-  return remote_find_successor(node, closest, id);
-}
-
-/**
- * \brief Asks another node the successor node of an id.
- * \param node the current node
- * \param ask_to the node to ask to
- * \param id the id to find
- * \return the id of the successor node, or -1 if the request failed
- */
-static int remote_find_successor(node_t node, int ask_to, int id)
-{
-  int successor = -1;
-  int stop = 0;
-  char mailbox[MAILBOX_NAME_SIZE];
-  get_mailbox(ask_to, mailbox);
-  task_data_t req_data = xbt_new0(s_task_data_t, 1);
-  req_data->type = TASK_FIND_SUCCESSOR;
-  req_data->request_id = id;
-  get_mailbox(node->id, req_data->answer_to);
-  req_data->issuer_host_name = MSG_host_get_name(MSG_host_self());
-
-  // send a "Find Successor" request to ask_to_id
-  m_task_t task_sent = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data);
-  XBT_DEBUG("Sending a 'Find Successor' request (task %p) to %d for id %d", task_sent, ask_to, id);
-  MSG_error_t res = MSG_task_send_with_timeout(task_sent, mailbox, timeout);
-
-  if (res != MSG_OK) {
-    XBT_DEBUG("Failed to send the 'Find Successor' request (task %p) to %d for id %d",
-        task_sent, ask_to, id);
-    task_free(task_sent);
-  }
-  else {
-
-    // receive the answer
-    XBT_DEBUG("Sent a 'Find Successor' request (task %p) to %d for key %d, waiting for the answer",
-        task_sent, ask_to, id);
-
-    do {
-      if (node->comm_receive == NULL) {
-        m_task_t task_received = NULL;
-        node->comm_receive = MSG_task_irecv(&task_received, node->mailbox);
-      }
-
-      res = MSG_comm_wait(node->comm_receive, timeout);
-
-      if (res != MSG_OK) {
-        XBT_DEBUG("Failed to receive the answer to my 'Find Successor' request (task %p): %d",
-            task_sent, res);
-        stop = 1;
-       MSG_comm_destroy(node->comm_receive);
-       node->comm_receive = NULL;
-      }
-      else {
-        m_task_t task_received = MSG_comm_get_task(node->comm_receive);
-        XBT_DEBUG("Received a task (%p)", task_received);
-        task_data_t ans_data = MSG_task_get_data(task_received);
-
-       if (MC_IS_ENABLED) {
-         MC_assert_stateful(task_received == task_sent);
-       }
-
-        if (task_received != task_sent) {
-          // this is not the expected answer
-         MSG_comm_destroy(node->comm_receive);
-         node->comm_receive = NULL;
-          handle_task(node, task_received);
-        }
-        else {
-          // this is our answer
-          XBT_DEBUG("Received the answer to my 'Find Successor' request for id %d (task %p): the successor of key %d is %d",
-              ans_data->request_id, task_received, id, ans_data->answer_id);
-          successor = ans_data->answer_id;
-          stop = 1;
-         MSG_comm_destroy(node->comm_receive);
-         node->comm_receive = NULL;
-          task_free(task_received);
-        }
-      }
-    } while (!stop);
-  }
-
-  return successor;
-}
-
-/**
- * \brief Asks another node its predecessor.
- * \param node the current node
- * \param ask_to the node to ask to
- * \return the id of its predecessor node, or -1 if the request failed
- * (or if the node does not know its predecessor)
- */
-static int remote_get_predecessor(node_t node, int ask_to)
-{
-  int predecessor_id = -1;
-  int stop = 0;
-  char mailbox[MAILBOX_NAME_SIZE];
-  get_mailbox(ask_to, mailbox);
-  task_data_t req_data = xbt_new0(s_task_data_t, 1);
-  req_data->type = TASK_GET_PREDECESSOR;
-  get_mailbox(node->id, req_data->answer_to);
-  req_data->issuer_host_name = MSG_host_get_name(MSG_host_self());
-
-  // send a "Get Predecessor" request to ask_to_id
-  XBT_DEBUG("Sending a 'Get Predecessor' request to %d", ask_to);
-  m_task_t task_sent = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data);
-  MSG_error_t res = MSG_task_send_with_timeout(task_sent, mailbox, timeout);
-
-  if (res != MSG_OK) {
-    XBT_DEBUG("Failed to send the 'Get Predecessor' request (task %p) to %d",
-        task_sent, ask_to);
-    task_free(task_sent);
-  }
-  else {
-
-    // receive the answer
-    XBT_DEBUG("Sent 'Get Predecessor' request (task %p) to %d, waiting for the answer on my mailbox '%s'",
-        task_sent, ask_to, req_data->answer_to);
-
-    do {
-      if (node->comm_receive == NULL) { // FIXME simplify this
-        m_task_t task_received = NULL;
-        node->comm_receive = MSG_task_irecv(&task_received, node->mailbox);
-      }
-
-      res = MSG_comm_wait(node->comm_receive, timeout);
-
-      if (res != MSG_OK) {
-        XBT_DEBUG("Failed to receive the answer to my 'Get Predecessor' request (task %p): %d",
-            task_sent, res);
-        stop = 1;
-       MSG_comm_destroy(node->comm_receive);
-       node->comm_receive = NULL;
-      }
-      else {
-        m_task_t task_received = MSG_comm_get_task(node->comm_receive);
-        task_data_t ans_data = MSG_task_get_data(task_received);
-
-       if (MC_IS_ENABLED) {
-         MC_assert_stateful(task_received == task_sent);
-       }
-
-        if (task_received != task_sent) {
-         MSG_comm_destroy(node->comm_receive);
-         node->comm_receive = NULL;
-          handle_task(node, task_received);
-        }
-        else {
-          XBT_DEBUG("Received the answer to my 'Get Predecessor' request (task %p): the predecessor of node %d is %d",
-              task_received, ask_to, ans_data->answer_id);
-          predecessor_id = ans_data->answer_id;
-          stop = 1;
-         MSG_comm_destroy(node->comm_receive);
-         node->comm_receive = NULL;
-          task_free(task_received);
-        }
-      }
-    } while (!stop);
-  }
-
-  return predecessor_id;
-}
-
-/**
- * \brief Returns the closest preceding finger of an id
- * with respect to the finger table of the current node.
- * \param node the current node
- * \param id the id to find
- * \return the closest preceding finger of that id
- */
-int closest_preceding_node(node_t node, int id)
-{
-  int i;
-  for (i = nb_bits - 1; i >= 0; i--) {
-    if (is_in_interval(node->fingers[i].id, node->id + 1, id - 1)) {
-      return node->fingers[i].id;
-    }
-  }
-  return node->id;
-}
-
-/**
- * \brief This function is called periodically. It checks the immediate
- * successor of the current node.
- * \param node the current node
- */
-static void stabilize(node_t node)
-{
-  XBT_DEBUG("Stabilizing node");
-
-  // get the predecessor of my immediate successor
-  int candidate_id;
-  int successor_id = node->fingers[0].id;
-  if (successor_id != node->id) {
-    candidate_id = remote_get_predecessor(node, successor_id);
-  }
-  else {
-    candidate_id = node->pred_id;
-  }
-
-  // this node is a candidate to become my new successor
-  if (candidate_id != -1
-      && is_in_interval(candidate_id, node->id + 1, successor_id - 1)) {
-    set_finger(node, 0, candidate_id);
-  }
-  if (successor_id != node->id) {
-    remote_notify(node, successor_id, node->id);
-  }
-}
-
-/**
- * \brief Notifies the current node that its predecessor may have changed.
- * \param node the current node
- * \param candidate_id the possible new predecessor
- */
-static void notify(node_t node, int predecessor_candidate_id) {
-
-  if (node->pred_id == -1
-    || is_in_interval(predecessor_candidate_id, node->pred_id + 1, node->id - 1)) {
-
-    set_predecessor(node, predecessor_candidate_id);
-    print_finger_table(node);
-  }
-  else {
-    XBT_DEBUG("I don't have to change my predecessor to %d", predecessor_candidate_id);
-  }
-}
-
-/**
- * \brief Notifies a remote node that its predecessor may have changed.
- * \param node the current node
- * \param notify_id id of the node to notify
- * \param candidate_id the possible new predecessor
- */
-static void remote_notify(node_t node, int notify_id, int predecessor_candidate_id) {
-
-  task_data_t req_data = xbt_new0(s_task_data_t, 1);
-  req_data->type = TASK_NOTIFY;
-  req_data->request_id = predecessor_candidate_id;
-  req_data->issuer_host_name = MSG_host_get_name(MSG_host_self());
-
-  // send a "Notify" request to notify_id
-  m_task_t task = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data);
-  XBT_DEBUG("Sending a 'Notify' request (task %p) to %d", task, notify_id);
-  char mailbox[MAILBOX_NAME_SIZE];
-  get_mailbox(notify_id, mailbox);
-  MSG_task_dsend(task, mailbox, task_free);
-}
-
-/**
- * \brief This function is called periodically.
- * It refreshes the finger table of the current node.
- * \param node the current node
- */
-static void fix_fingers(node_t node) {
-
-  XBT_DEBUG("Fixing fingers");
-  int i = node->next_finger_to_fix;
-  int id = find_successor(node, node->id + powers2[i]);
-  if (id != -1) {
-
-    if (id != node->fingers[i].id) {
-      set_finger(node, i, id);
-      print_finger_table(node);
-    }
-    node->next_finger_to_fix = (i + 1) % nb_bits;
-  }
-}
-
-/**
- * \brief This function is called periodically.
- * It checks whether the predecessor has failed
- * \param node the current node
- */
-static void check_predecessor(node_t node)
-{
-  XBT_DEBUG("Checking whether my predecessor is alive");
-  // TODO
-}
-
-/**
- * \brief Performs a find successor request to a random id.
- * \param node the current node
- */
-static void random_lookup(node_t node)
-{
-  int id = 1337; // TODO pick a pseudorandom id
-  XBT_DEBUG("Making a lookup request for id %d", id);
-  find_successor(node, id);
-}
-
-/**
- * \brief Main function.
- */
-int main(int argc, char *argv[])
-{
-  xbt_os_timer_t timer = xbt_os_timer_new();
-
-  MSG_global_init(&argc, argv);
-  if (argc < 3) {
-    printf("Usage: %s [-nb_bits=n] [-timeout=t] platform_file deployment_file\n", argv[0]);
-    printf("example: %s ../msg_platform.xml chord.xml\n", argv[0]);
-    exit(1);
-  }
-
-  char **options = &argv[1];
-  while (!strncmp(options[0], "-", 1)) {
-
-    int length = strlen("-nb_bits=");
-    if (!strncmp(options[0], "-nb_bits=", length) && strlen(options[0]) > length) {
-      nb_bits = atoi(options[0] + length);
-      XBT_DEBUG("Set nb_bits to %d", nb_bits);
-    }
-    else {
-
-      length = strlen("-timeout=");
-      if (!strncmp(options[0], "-timeout=", length) && strlen(options[0]) > length) {
-       timeout = atoi(options[0] + length);
-       XBT_DEBUG("Set timeout to %d", timeout);
-      }
-      else {
-       xbt_die("Invalid chord option '%s'", options[0]);
-      }
-    }
-    options++;
-  }
-
-  const char* platform_file = options[0];
-  const char* application_file = options[1];
-
-  chord_initialize();
-
-  MSG_create_environment(platform_file);
-
-  MSG_function_register("node", node);
-  MSG_launch_application(application_file);
-
-  xbt_os_timer_start(timer);
-  MSG_error_t res = MSG_main_stateful();
-  xbt_os_timer_stop(timer);
-  XBT_CRITICAL("Simulation time %lf, messages created: %ld", xbt_os_timer_elapsed(timer), smx_total_comms);
-  XBT_INFO("Simulated time: %g", MSG_get_clock());
-
-  MSG_clean();
-
-  if (res == MSG_OK)
-    return 0;
-  else
-    return 1;
-}
index 3e5d219..7dadf97 100644 (file)
@@ -154,12 +154,15 @@ XBT_PUBLIC(e_smx_state_t) simcall_process_sleep(double duration);
 
 /************************** Comunication simcalls *****************************/
 /***** Rendez-vous points *****/
+
 XBT_PUBLIC(smx_rdv_t) simcall_rdv_create(const char *name);
 XBT_PUBLIC(void) simcall_rdv_destroy(smx_rdv_t rvp);
 XBT_PUBLIC(smx_rdv_t) simcall_rdv_get_by_name(const char *name);
 XBT_PUBLIC(int) simcall_rdv_comm_count_by_host(smx_rdv_t rdv, smx_host_t host);
 XBT_PUBLIC(smx_action_t) simcall_rdv_get_head(smx_rdv_t rdv);
 
+XBT_PUBLIC(xbt_dict_t) SIMIX_get_rdv_points(void);
+
 /***** Communication simcalls *****/
 
 XBT_PUBLIC(void) simcall_comm_send(smx_rdv_t rdv, double task_size,
index f167e24..8ecb836 100644 (file)
@@ -64,7 +64,7 @@ extern int mmtrace(void);
 
 extern void *mmalloc_findbase(int size);
 
-extern int mmalloc_compare_heap(void *h1, void *h2);
+extern int mmalloc_compare_heap(void *h1, void *h2, void *std_heap_addr);
 
 extern void mmalloc_display_info_heap(void *h);
 
index 5df49f1..da376da 100644 (file)
@@ -18,7 +18,7 @@ static mc_mem_region_t MC_region_new(int type, void *start_addr, size_t size)
   new_reg->start_addr = start_addr;
   new_reg->size = size;
   new_reg->data = xbt_malloc0(size);
-  XBT_DEBUG("New reg data %p, start_addr %p", new_reg->data, start_addr);
+  XBT_DEBUG("New reg data %p, start_addr %p, size %zu", new_reg->data, start_addr, size);
   memcpy(new_reg->data, start_addr, size);
   
   return new_reg;
@@ -72,10 +72,7 @@ static void MC_snapshot_add_region(mc_snapshot_t snapshot, int type, void *start
     XBT_DEBUG("New region libsimgrid (%zu)", size);
     break;
   case 2 : 
-    XBT_DEBUG("New region program (%zu)", size);
-    break;
-  case 3 : 
-    XBT_DEBUG("New region stack (%zu)", size);
+    XBT_DEBUG("New region program data (%zu)", size);
     break;
   }
   mc_mem_region_t new_reg = MC_region_new(type, start_addr, size);
@@ -134,18 +131,10 @@ void MC_take_snapshot_liveness(mc_snapshot_t snapshot)
         if (reg.start_addr == std_heap){ // only save the std heap (and not the raw one)
          MC_snapshot_add_region(snapshot, 0, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr);
         }
-      } else {
+      }else {
         if (!memcmp(basename(maps->regions[i].pathname), "libsimgrid", 10)){
           MC_snapshot_add_region(snapshot, 1, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr);
-        } else {
-         if (!memcmp(basename(maps->regions[i].pathname), basename(prog_name), strlen(basename(prog_name)))){
-           MC_snapshot_add_region(snapshot, 2, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr);
-         } /*else {
-           if (!memcmp(maps->regions[i].pathname, "[stack]", 7)){
-             MC_snapshot_add_region(snapshot, 3, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr);
-           }
-           }*/
-       }
+        } 
       }
     }
     i++;
@@ -205,10 +194,7 @@ void MC_restore_snapshot(mc_snapshot_t snapshot)
       XBT_DEBUG("libsimgrid (data) restored");
       break;
     case 2:
-      XBT_DEBUG("program (data) restored");
-      break;
-    case 3:
-      XBT_DEBUG("stack restored");
+      XBT_DEBUG("data program restored");
       break;
     }
 
index 19a312f..00a2eb9 100644 (file)
@@ -10,6 +10,8 @@ xbt_dynar_t visited_pairs;
 xbt_dynar_t visited_pairs_hash;
 xbt_dynar_t successors;
 
+xbt_dynar_t hosts_table;
+
 
 /* fast implementation of djb2 algorithm */
 unsigned int hash_region(char *str, int str_len){
@@ -49,7 +51,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
     }
 
     switch(s1->regions[i]->type){
-    case 0:
+      case 0:
       if(s1->regions[i]->size != s2->regions[i]->size){
        if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
          XBT_DEBUG("Different size of heap (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
@@ -66,7 +68,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
          return 1;
        }
       }
-      if(mmalloc_compare_heap(s1->regions[i]->data, s2->regions[i]->data)){
+      if(mmalloc_compare_heap(s1->regions[i]->data, s2->regions[i]->data, std_heap)){
        if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
          XBT_DEBUG("Different heap (mmalloc_compare)");
          errors++; 
@@ -75,7 +77,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
        }
       }
       break;
-    case 1 :
+      /*case 1 :
       if(s1->regions[i]->size != s2->regions[i]->size){
        if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
          XBT_DEBUG("Different size of libsimgrid (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
@@ -95,74 +97,20 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
       if(memcmp(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
        if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
          XBT_DEBUG("Different memcmp for data in libsimgrid");
+         XBT_DEBUG("Size : %zu", s1->regions[i]->size);
          errors++;
        }else{
          return 1;
        }
       }
-      break;
-      /*case 2:
-      if(s1->regions[i]->size != s2->regions[i]->size){
-       if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
-         XBT_DEBUG("Different size of program (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
-         errors++;
-       }else{
-         return 1;
-       }
-      } 
-      if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
-       if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
-         XBT_DEBUG("Different start addr of program (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
-         errors++;
-       }else{
-         return 1;
-       }
-      }
-      if(memcmp(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
-       if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
-         XBT_DEBUG("Different memcmp for data in program");
-         errors++;
-       }else{
-         return 1;
-       }
-      }
       break;*/
-    case 3:
-      if(s1->regions[i]->size != s2->regions[i]->size){
-       if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
-         XBT_DEBUG("Different size of stack (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
-         errors++;
-       }else{
-         return 1;
-       }
-      }
-      if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
-       if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
-         XBT_DEBUG("Different start addr of stack (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
-         errors++;
-       }else{
-         return 1;
-       }
-      }
-      if(memcmp(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
-       if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
-         XBT_DEBUG("Different memcmp for data in stack");
-         errors++;
-       }else{
-         return 1;
-       }
-      }
-      break;
     default:
       break;
     }
   }
 
-  if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
-    return (errors>0);
-  }else{
-    return 0;
-  }
+  return (errors > 0);
+  
   
 }
 
@@ -196,20 +144,26 @@ int reached(xbt_state_t st){
     cursor = 0;
     mc_pair_reached_t pair_test = NULL;
 
-
+    //xbt_dict_t current_rdv_points = SIMIX_get_rdv_points();
+     
     xbt_dynar_foreach(reached_pairs, cursor, pair_test){
+      XBT_DEBUG("Pair reached #%d", cursor+1);
       if(automaton_state_compare(pair_test->automaton_state, st) == 0){
        if(propositional_symbols_compare_value(pair_test->prop_ato, prop_ato) == 0){
-         XBT_DEBUG("Pair reached %d", cursor+1);
-         if(snapshot_compare(pair_test->system_state, sn) == 0){
-           MC_free_snapshot(sn);
-           xbt_dynar_reset(prop_ato);
-           xbt_free(prop_ato);
-           MC_UNSET_RAW_MEM;
-           return 1;
+         //XBT_DEBUG("Rdv points size %d - %d", xbt_dict_length(pair_test->rdv_points), xbt_dict_length(current_rdv_points));
+         //if(xbt_dict_length(pair_test->rdv_points) == xbt_dict_length(current_rdv_points)){
+         //if(rdv_points_compare(pair_test->rdv_points, current_rdv_points) == 0){
+             if(snapshot_compare(pair_test->system_state, sn) == 0){
+               MC_free_snapshot(sn);
+               xbt_dynar_reset(prop_ato);
+               xbt_free(prop_ato);
+               MC_UNSET_RAW_MEM;
+               return 1;
+             }
+             /* }
          }else{
-           XBT_DEBUG("Different snapshot");
-         }
+           XBT_DEBUG("Different size of rdv points (%d - %d)",xbt_dict_length(pair_test->rdv_points), xbt_dict_length(current_rdv_points) );
+           }*/
        }else{
          XBT_DEBUG("Different values of propositional symbols");
        }
@@ -227,6 +181,167 @@ int reached(xbt_state_t st){
   }
 }
 
+int rdv_points_compare(xbt_dict_t d1, xbt_dict_t d2){ /* d1 = pair_test, d2 = current_pair */ 
+  
+   xbt_dict_cursor_t cursor_dict = NULL;
+   char *key;
+   char *data;
+   smx_rdv_t rdv1, rdv2;
+   xbt_fifo_item_t item1, item2;
+   smx_action_t action1, action2;
+   xbt_fifo_item_t item_req1, item_req2;
+   smx_req_t req1, req2;
+   int i=0;
+   int j=0;
+
+   xbt_dict_foreach(d1, cursor_dict, key, data){
+     rdv1 = (smx_rdv_t)data;
+     rdv2 = xbt_dict_get_or_null(d2, rdv1->name);
+     if(rdv2 == NULL){
+       XBT_DEBUG("Rdv point unknown");
+       return 1;
+     }else{
+       if(xbt_fifo_size(rdv1->comm_fifo) != xbt_fifo_size(rdv2->comm_fifo)){
+        XBT_DEBUG("Different total of actions in mailbox \"%s\" (%d - %d)", rdv1->name, xbt_fifo_size(rdv1->comm_fifo),xbt_fifo_size(rdv2->comm_fifo) );
+        return 1;
+       }else{
+        
+        XBT_DEBUG("Total of actions in mailbox \"%s\" : %d", rdv1->name, xbt_fifo_size(rdv1->comm_fifo)); 
+        
+        item1 = xbt_fifo_get_first_item(rdv1->comm_fifo);      
+        item2 = xbt_fifo_get_first_item(rdv2->comm_fifo);
+
+        while(i<xbt_fifo_size(rdv1->comm_fifo)){
+          action1 = (smx_action_t) xbt_fifo_get_item_content(item1);
+          action2 = (smx_action_t) xbt_fifo_get_item_content(item2);
+
+          if(action1->type != action2->type){
+            XBT_DEBUG("Different type of action");
+            return 1;
+          }
+
+          if(action1->state != action2->state){
+            XBT_DEBUG("Different state of action");
+            return 1;
+          }
+
+          if(xbt_fifo_size(action1->request_list) != xbt_fifo_size(action2->request_list)){
+            XBT_DEBUG("Different size of request list (%d - %d", xbt_fifo_size(action1->request_list), xbt_fifo_size(action2->request_list));
+            return 1;
+          }else{
+
+            item_req1 = xbt_fifo_get_first_item(action1->request_list);        
+            item_req2 = xbt_fifo_get_first_item(action2->request_list);
+
+            while(j<xbt_fifo_size(action1->request_list)){
+
+              req1 = (smx_req_t) xbt_fifo_get_item_content(item_req1);
+              req2 = (smx_req_t) xbt_fifo_get_item_content(item_req2);
+              
+              if(req1->call != req2->call){
+                XBT_DEBUG("Different request call in request_list of action (%d - %d)", req1->call, req2->call);
+                return 1;
+              }
+              if(req1->issuer->pid != req2->issuer->pid){
+                XBT_DEBUG("Different request issuer in request_list of action (%lu- %lu)", req1->issuer->pid, req2->issuer->pid);
+                return 1;
+              }
+
+              item_req1 = xbt_fifo_get_next_item(item_req1);   
+              item_req2 = xbt_fifo_get_next_item(item_req2);
+              j++;
+              
+            }
+          }
+
+          switch(action1->type){
+          case 0: /* execution */
+          case 1: /* parallel execution */
+            if(strcmp(action1->execution.host->name, action2->execution.host->name) != 0)
+              return 1;
+            break;
+          case 2: /* comm */
+            if(action1->comm.type != action2->comm.type)
+              return 1;
+            //XBT_DEBUG("Type of comm : %d", action1->comm.type);
+            
+            switch(action1->comm.type){
+            case 0: /* SEND */
+              if(action1->comm.src_proc->pid != action2->comm.src_proc->pid)
+                return 1;
+              if(strcmp(action1->comm.src_proc->smx_host->name, action2->comm.src_proc->smx_host->name) != 0)
+                return 1;
+              break;
+            case 1: /* RECEIVE */
+              if(action1->comm.dst_proc->pid != action2->comm.dst_proc->pid)
+                return 1;
+              if(strcmp(action1->comm.dst_proc->smx_host->name, action2->comm.dst_proc->smx_host->name) != 0)
+                return 1;
+              break;
+            case 2: /* READY */
+              if(action1->comm.src_proc->pid != action2->comm.src_proc->pid)
+                return 1;
+              if(strcmp(action1->comm.src_proc->smx_host->name, action2->comm.src_proc->smx_host->name) != 0)
+                return 1;
+              if(action1->comm.dst_proc->pid != action2->comm.dst_proc->pid)
+                return 1;
+              if(strcmp(action1->comm.dst_proc->smx_host->name, action2->comm.dst_proc->smx_host->name) != 0)
+                return 1;
+              break;
+            case 3: /* DONE */
+              if(action1->comm.src_proc->pid != action2->comm.src_proc->pid)
+                return 1;
+              if(strcmp(action1->comm.src_proc->smx_host->name, action2->comm.src_proc->smx_host->name) != 0)
+                return 1;
+              if(action1->comm.dst_proc->pid != action2->comm.dst_proc->pid)
+                return 1;
+              if(strcmp(action1->comm.dst_proc->smx_host->name, action2->comm.dst_proc->smx_host->name) != 0)
+                return 1;
+              break;
+              
+            } /* end of switch on type of comm */
+            
+            if(action1->comm.refcount != action2->comm.refcount)
+              return 1;
+            if(action1->comm.detached != action2->comm.detached)
+              return 1;
+            if(action1->comm.rate != action2->comm.rate)
+              return 1;
+            if(action1->comm.task_size != action2->comm.task_size)
+              return 1;
+            if(action1->comm.src_buff != action2->comm.src_buff)
+              return 1;
+            if(action1->comm.dst_buff != action2->comm.dst_buff)
+              return 1;
+            if(action1->comm.src_data != action2->comm.src_data)
+              return 1;
+            if(action1->comm.dst_data != action2->comm.dst_data)
+              return 1;
+            
+            break;
+          case 3: /* sleep */
+            if(strcmp(action1->sleep.host->name, action2->sleep.host->name) != 0)
+              return 1;
+            break;
+          case 4: /* synchro */
+            
+            break;
+          default:
+            break;
+          }
+
+          item1 = xbt_fifo_get_next_item(item1);       
+          item2 = xbt_fifo_get_next_item(item2);
+          i++;
+        }
+       }
+     }
+   }
+
+   return 0;
+   
+}
+
 void set_pair_reached(xbt_state_t st){
 
  
@@ -237,6 +352,7 @@ void set_pair_reached(xbt_state_t st){
   pair->automaton_state = st;
   pair->prop_ato = xbt_dynar_new(sizeof(int), NULL);
   pair->system_state = xbt_new0(s_mc_snapshot_t, 1);
+  //pair->rdv_points = xbt_dict_new();  
   MC_take_snapshot_liveness(pair->system_state);
 
   /* Get values of propositional symbols */
@@ -250,13 +366,38 @@ void set_pair_reached(xbt_state_t st){
     res = (*f)();
     xbt_dynar_push_as(pair->prop_ato, int, res);
   }
-  
+
+  /*xbt_dict_t rdv_points = SIMIX_get_rdv_points();
+
+  xbt_dict_cursor_t cursor_dict = NULL;
+  char *key;
+  char *data;
+  xbt_fifo_item_t item;
+  smx_action_t action;
+
+  xbt_dict_foreach(rdv_points, cursor_dict, key, data){
+    smx_rdv_t new_rdv = xbt_new0(s_smx_rvpoint_t, 1);
+    new_rdv->name = strdup(((smx_rdv_t)data)->name);
+    new_rdv->comm_fifo = xbt_fifo_new();
+    xbt_fifo_foreach(((smx_rdv_t)data)->comm_fifo, item, action, smx_action_t) {
+      smx_action_t a = xbt_new0(s_smx_action_t, 1);
+      memcpy(a, action, sizeof(s_smx_action_t));
+      xbt_fifo_push(new_rdv->comm_fifo, a);
+      XBT_DEBUG("New action (type = %d, state = %d) in mailbox \"%s\"", action->type, action->state, key);
+      if(action->type==2)
+       XBT_DEBUG("Type of communication : %d, Ref count = %d", action->comm.type, action->comm.refcount);
+    }
+    //new_rdv->comm_fifo = xbt_fifo_copy(((smx_rdv_t)data)->comm_fifo);
+    xbt_dict_set(pair->rdv_points, new_rdv->name, new_rdv, NULL);
+    }*/
   xbt_dynar_push(reached_pairs, &pair); 
 
   MC_UNSET_RAW_MEM;
   
 }
 
+
 int reached_hash(xbt_state_t st){
 
 
@@ -648,9 +789,6 @@ int MC_automaton_evaluate_label(xbt_exp_label_t l){
 }
 
 
-
-
-
 /********************* Double-DFS stateless *******************/
 
 void MC_pair_stateless_delete(mc_pair_stateless_t pair){
index d35bbdd..3c70060 100644 (file)
@@ -18,6 +18,9 @@
 #include "../simix/private.h"
 #include "xbt/automaton.h"
 #include "xbt/hash.h"
+#include "msg/msg.h"
+#include "msg/datatypes.h"
+#include "simix/datatypes.h"
 
 /****************************** Snapshots ***********************************/
 
@@ -221,6 +224,7 @@ typedef struct s_mc_pair_reached{
   xbt_state_t automaton_state;
   xbt_dynar_t prop_ato;
   mc_snapshot_t system_state;
+  //xbt_dict_t rdv_points;
 }s_mc_pair_reached_t, *mc_pair_reached_t;
 
 typedef struct s_mc_pair_visited{
@@ -243,6 +247,8 @@ typedef struct s_mc_pair_reached_hash{
   unsigned int *hash_regions;
 }s_mc_pair_reached_hash_t, *mc_pair_reached_hash_t;
 
+
+
 int MC_automaton_evaluate_label(xbt_exp_label_t l);
 mc_pair_t new_pair(mc_snapshot_t sn, mc_state_t sg, xbt_state_t st);
 
@@ -259,6 +265,7 @@ void set_pair_visited(xbt_state_t st, int search_cycle);
 int visited_hash(xbt_state_t st, int search_cycle);
 void set_pair_visited_hash(xbt_state_t st, int search_cycle);
 unsigned int hash_region(char *str, int str_len);
+int rdv_points_compare(xbt_dict_t d1, xbt_dict_t d2);
 
 
 /* **** Double-DFS stateless **** */
index d234bb3..6c52ac7 100644 (file)
@@ -67,6 +67,11 @@ void SIMIX_rdv_free(void *data)
   xbt_free(rdv);  
 }
 
+xbt_dict_t SIMIX_get_rdv_points()
+{
+  return rdv_points;
+}
+
 smx_rdv_t SIMIX_rdv_get_by_name(const char *name)
 {
   return xbt_dict_get_or_null(rdv_points, name);
index 2f9a247..c75d10b 100644 (file)
@@ -168,7 +168,7 @@ void mmalloc_postexit(void)
   mmalloc_pre_detach(__mmalloc_default_mdp);
 }
 
-int mmalloc_compare_heap(void *h1, void *h2){
+int mmalloc_compare_heap(void *h1, void *h2, void *std_heap_addr){
 
   if(h1 == NULL && h2 == NULL){
     XBT_DEBUG("Malloc descriptors null");
@@ -177,115 +177,190 @@ int mmalloc_compare_heap(void *h1, void *h2){
 
   /* Heapstats */
 
+  int errors = 0;
+
   struct mstats ms1 = mmstats(h1);
   struct mstats ms2 = mmstats(h2);
 
   if(ms1.chunks_used !=  ms2.chunks_used){
-    XBT_DEBUG("Different chunks allocated by the user : %zu - %zu", ms1.chunks_used, ms2.chunks_used);
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different chunks allocated by the user : %zu - %zu", ms1.chunks_used, ms2.chunks_used);
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
   if(ms1.bytes_used !=  ms2.bytes_used){
-    XBT_DEBUG("Different byte total of user-allocated chunks : %zu - %zu", ms1.bytes_used, ms2.bytes_used);
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different byte total of user-allocated chunks : %zu - %zu", ms1.bytes_used, ms2.bytes_used);
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
   if(ms1.bytes_free !=  ms2.bytes_free){
-    XBT_DEBUG("Different byte total of chunks in the free list : %zu - %zu", ms1.bytes_free, ms2.bytes_free);
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different byte total of chunks in the free list : %zu - %zu", ms1.bytes_free, ms2.bytes_free);
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
   if(ms1.chunks_free !=  ms2.chunks_free){
-    XBT_DEBUG("Different chunks in the free list : %zu - %zu", ms1.chunks_free, ms2.chunks_free);
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different chunks in the free list : %zu - %zu", ms1.chunks_free, ms2.chunks_free);
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
   struct mdesc *mdp1, *mdp2;
   mdp1 = MD_TO_MDP(h1);
   mdp2 = MD_TO_MDP(h2);
 
-  return mmalloc_compare_mdesc(mdp1, mdp2);
+  int res = mmalloc_compare_mdesc(mdp1, mdp2, std_heap_addr);
+
+  return ((errors + res ) > 0);
 
 }
 
-int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2){
+int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap_addr){
+
+  int errors = 0;
 
   if(mdp1->headersize != mdp2->headersize){
-    XBT_DEBUG("Different size of the file header for the mapped files");
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different size of the file header for the mapped files");
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
   if(mdp1->refcount != mdp2->refcount){
-    XBT_DEBUG("Different number of processes that attached the heap");
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different number of processes that attached the heap");
+      errors++;
+    }else{
+      return 1;
+    }
   }
  
   if(strcmp(mdp1->magic, mdp2->magic) != 0){
-    XBT_DEBUG("Different magic number");
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different magic number");
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
   if(mdp1->flags != mdp2->flags){
-    XBT_DEBUG("Different flags");
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different flags");
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
   if(mdp1->heapsize != mdp2->heapsize){
-    XBT_DEBUG("Different number of info entries");
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different number of info entries");
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
   //XBT_DEBUG("Heap size : %zu", mdp1->heapsize);
 
   if(mdp1->heapbase != mdp2->heapbase){
-    XBT_DEBUG("Different first block of the heap");
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different first block of the heap");
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
 
   if(mdp1->heapindex != mdp2->heapindex){
-    XBT_DEBUG("Different index for the heap table : %zu - %zu", mdp1->heapindex, mdp2->heapindex);
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different index for the heap table : %zu - %zu", mdp1->heapindex, mdp2->heapindex);
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
   //XBT_DEBUG("Heap index : %zu", mdp1->heapindex);
 
   if(mdp1->base != mdp2->base){
-    XBT_DEBUG("Different base address of the memory region");
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different base address of the memory region");
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
   if(mdp1->breakval != mdp2->breakval){
-    XBT_DEBUG("Different current location in the memory region");
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different current location in the memory region");
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
   if(mdp1->top != mdp2->top){
-    XBT_DEBUG("Different end of the current location in the memory region");
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different end of the current location in the memory region");
+      errors++;
+    }else{
+      return 1;
+    }
   }
   
   if(mdp1->heaplimit != mdp2->heaplimit){
-    XBT_DEBUG("Different limit of valid info table indices");
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different limit of valid info table indices");
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
-  //XBT_DEBUG("Heap limit : %zu", mdp1->heaplimit);
-
-
   if(mdp1->fd != mdp2->fd){
-    XBT_DEBUG("Different file descriptor for the file to which this malloc heap is mapped");
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different file descriptor for the file to which this malloc heap is mapped");
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
   if(mdp1->saved_errno != mdp2->saved_errno){
-    XBT_DEBUG("Different errno");
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different errno");
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
   if(mdp1->version != mdp2->version){
-    XBT_DEBUG("Different version of the mmalloc package");
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different version of the mmalloc package");
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
  
@@ -309,15 +384,23 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2){
   }
 
   if(block_free1 !=  block_free2){
-    XBT_DEBUG("Different first free block");
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different first free block");
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
   first_block_free = block_free1;
 
   if(mdp1->heapinfo[first_block_free].free.size != mdp2->heapinfo[first_block_free].free.size){ 
-    XBT_DEBUG("Different size (in blocks) of the first free cluster");
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different size (in blocks) of the first free cluster");
+      errors++;
+    }else{
+      return 1;
+    }
   }
 
   /* Check busy blocks (circular checking)*/
@@ -325,26 +408,31 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2){
   i = first_block_free + mdp1->heapinfo[first_block_free].free.size;
 
   if(mdp1->heapinfo[first_block_free].free.next != mdp2->heapinfo[first_block_free].free.next){
-    XBT_DEBUG("Different next block free");
-    return 1;
+    if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+      XBT_DEBUG("Different next block free");
+      errors++;
+    }else{
+      return 1;
+    }
   }
   
   block_free = first_block_free;
   next_block_free = mdp1->heapinfo[first_block_free].free.next;
 
-  //XBT_DEBUG("First block free : %zu (size=%zu), Next block free : %zu", first_block_free, mdp1->heapinfo[block_free1].free.size, next_block_free);
-
   if(next_block_free == 0)
     next_block_free = mdp1->heaplimit;
 
-
   while(i != first_block_free){
 
     while(i<next_block_free){
 
       if(mdp1->heapinfo[i].busy.type != mdp2->heapinfo[i].busy.type){
-       XBT_DEBUG("Different type of busy block");
-       return 1;
+       if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+         XBT_DEBUG("Different type of busy block");
+         errors++;
+       }else{
+         return 1;
+       }
       }else{
 
        addr_block1 = (char *)mdp1 + sizeof(struct mdesc) + ((i-1) * BLOCKSIZE); 
@@ -353,65 +441,163 @@ int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2){
        switch(mdp1->heapinfo[i].busy.type){
        case 0 :
          if(mdp1->heapinfo[i].busy.info.size != mdp2->heapinfo[i].busy.info.size){
-           XBT_DEBUG("Different size of a large cluster");
-           return 1;
+           if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+             XBT_DEBUG("Different size of a large cluster");
+             errors++;
+           }else{
+             return 1;
+           }
          }else{
            if(memcmp(addr_block1, addr_block2, (mdp1->heapinfo[i].busy.info.size * BLOCKSIZE)) != 0){
-             XBT_DEBUG("Different data in block %zu", i);
-             return 1;
+             if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){           
+               XBT_DEBUG("Different data in block %zu (size = %zu) (addr_block1 = %p (current = %p) - addr_block2 = %p)", i, mdp1->heapinfo[i].busy.info.size, addr_block1, (char *)std_heap_addr + sizeof(struct mdesc) + ((i-1) * BLOCKSIZE), addr_block2);
+               errors++;
+             }else{
+               return 1;
+             }
            } 
          }
          i = i+mdp1->heapinfo[i].busy.info.size;
+
          break;
        default :         
          if(mdp1->heapinfo[i].busy.info.frag.nfree != mdp2->heapinfo[i].busy.info.frag.nfree){
-           XBT_DEBUG("Different free fragments in the fragmented block %zu", i);
-           return 1;
+           if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+             XBT_DEBUG("Different free fragments in the fragmented block %zu", i);
+             errors++;
+           }else{
+             return 1;
+           }
          }else{
            if(mdp1->heapinfo[i].busy.info.frag.first != mdp2->heapinfo[i].busy.info.frag.first){
-             XBT_DEBUG("Different first free fragments in the block %zu", i);
-             return 1; 
+             if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+               XBT_DEBUG("Different first free fragments in the block %zu", i);
+               errors++;
+             }else{
+               return 1;
+             } 
            }else{
              frag_size = pow(2,mdp1->heapinfo[i].busy.type);
              for(j=0 ; j< (BLOCKSIZE/frag_size); j++){
                if(memcmp((char *)addr_block1 + (j * frag_size), (char *)addr_block2 + (j * frag_size), frag_size) != 0){
-                 XBT_DEBUG("Different data in fragment %zu of block %zu", j + 1, i);
-                 return 1;
+                 if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+                   XBT_DEBUG("Different data in fragment %zu (addr_frag1 = %p - addr_frag2 = %p) of block %zu", j + 1, (char *)addr_block1 + (j * frag_size), (char *)addr_block2 + (j * frag_size),  i);
+                   errors++;
+                 }else{
+                   return 1;
+                 }
                } 
              }
            }
          }
+
          i++;
+
          break;
        }
 
       }
     }
 
-    if(mdp1->heapinfo[block_free].free.next != mdp2->heapinfo[block_free].free.next){
-      XBT_DEBUG("Different next block free");
-      return 1;
-    }
-     
-    block_free = mdp1->heapinfo[block_free].free.next;
-    next_block_free = mdp1->heapinfo[block_free].free.next;
-    if(i != first_block_free){
-      if(block_free != 0){
-       if(mdp1->heapinfo[block_free].free.size != mdp2->heapinfo[block_free].free.size){
-         XBT_DEBUG("Different size of block free");
+    if( i != first_block_free){
+
+      if(mdp1->heapinfo[block_free].free.next != mdp2->heapinfo[block_free].free.next){
+       if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+         XBT_DEBUG("Different next block free");
+         errors++;
+       }else{
          return 1;
        }
-       i = block_free + mdp1->heapinfo[block_free].free.size;
-      }else{
-       i = 1;
       }
+     
+      block_free = mdp1->heapinfo[block_free].free.next;
+      next_block_free = mdp1->heapinfo[block_free].free.next;
+
+      i = block_free + mdp1->heapinfo[block_free].free.size;
+
+      if((next_block_free == 0) && (i != mdp1->heaplimit)){
+
+       while(i < mdp1->heaplimit){
+
+         if(mdp1->heapinfo[i].busy.type != mdp2->heapinfo[i].busy.type){
+           if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+             XBT_DEBUG("Different type of busy block");
+             errors++;
+           }else{
+             return 1;
+           }
+         }else{
+
+           addr_block1 = (char *)mdp1 + sizeof(struct mdesc) + ((i-1) * BLOCKSIZE); 
+           addr_block2 = (char *)mdp2 + sizeof(struct mdesc) + ((i-1) * BLOCKSIZE); 
+       
+           switch(mdp1->heapinfo[i].busy.type){
+           case 0 :
+             if(mdp1->heapinfo[i].busy.info.size != mdp2->heapinfo[i].busy.info.size){
+               if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+                 XBT_DEBUG("Different size of a large cluster");
+                 errors++;
+               }else{
+                 return 1;
+               }
+             }else{
+               if(memcmp(addr_block1, addr_block2, (mdp1->heapinfo[i].busy.info.size * BLOCKSIZE)) != 0){
+                 if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){       
+                   XBT_DEBUG("Different data in block %zu (addr_block1 = %p (current = %p) - addr_block2 = %p)", i, addr_block1, (char *)std_heap_addr + sizeof(struct mdesc) + ((i-1) * BLOCKSIZE), addr_block2);
+                   errors++;
+                 }else{
+                   return 1;
+                 }
+               } 
+             }
+           
+             i = i+mdp1->heapinfo[i].busy.info.size;
+
+             break;
+           default :     
+             if(mdp1->heapinfo[i].busy.info.frag.nfree != mdp2->heapinfo[i].busy.info.frag.nfree){
+               if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+                 XBT_DEBUG("Different free fragments in the fragmented block %zu", i);
+                 errors++;
+               }else{
+                 return 1;
+               }
+             }else{
+               if(mdp1->heapinfo[i].busy.info.frag.first != mdp2->heapinfo[i].busy.info.frag.first){
+                 if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+                   XBT_DEBUG("Different first free fragments in the block %zu", i);
+                   errors++;
+                 }else{
+                   return 1;
+                 } 
+               }else{
+                 frag_size = pow(2,mdp1->heapinfo[i].busy.type);
+                 for(j=0 ; j< (BLOCKSIZE/frag_size); j++){
+                   if(memcmp((char *)addr_block1 + (j * frag_size), (char *)addr_block2 + (j * frag_size), frag_size) != 0){
+                     if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
+                       XBT_DEBUG("Different data in fragment %zu (addr_frag1 = %p - addr_frag2 = %p) of block %zu", j + 1, (char *)addr_block1 + (j * frag_size), (char *)addr_block2 + (j * frag_size),  i);
+                       errors++;
+                     }else{
+                       return 1;
+                     }
+                   } 
+                 }
+               }
+             }
+
+             i++;
+
+             break;
+           }
+         }
+       }
+
+      }
+
     }
-      
   }
   
-  return 0;   
-  
-  
+  return (errors>0);    
 }
 
  
index fa9b62a..509eaff 100644 (file)
@@ -267,9 +267,9 @@ struct mdesc {
 
 };
 
-int mmalloc_compare_heap(void *h1, void *h2);
+int mmalloc_compare_heap(void *h1, void *h2, void *std_heap_addr);
 
-int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2);
+int mmalloc_compare_mdesc(struct mdesc *mdp1, struct mdesc *mdp2, void *std_heap_addr);
 
 void mmalloc_display_info(void *h);