#include "xbt/setset.h"
#include "xbt/config.h"
#include "xbt/function_types.h"
-#include "mmalloc.h"
+#include "xbt/mmalloc.h"
#include "../simix/private.h"
/****************************** Snapshots ***********************************/
typedef struct s_mc_snapshot {
size_t heap_size;
size_t data_size;
- void* data;
- void* heap;
+ void *data;
+ void *heap;
} s_mc_snapshot_t, *mc_snapshot_t;
void MC_dpor_init(void);
void MC_dfs(void);
void MC_dpor(void);
+void MC_dfs_exit(void);
+void MC_dpor_exit(void);
+
+
/******************************* Transitions **********************************/
-typedef struct s_mc_transition{
+typedef enum {
+ mc_isend,
+ mc_irecv,
+ mc_test,
+ mc_wait,
+ mc_waitany,
+ mc_random
+} mc_trans_type_t;
+
+typedef struct s_mc_transition {
XBT_SETSET_HEADERS;
- char* name;
- unsigned int refcount;
- mc_trans_type_t type;
+ char *name;
smx_process_t process;
- smx_rdv_t rdv;
- smx_comm_t comm; /* reference to the simix network communication */
+ mc_trans_type_t type;
+
+ union {
+ struct {
+ smx_rdv_t rdv;
+ } isend;
+
+ struct {
+ smx_rdv_t rdv;
+ } irecv;
+
+ struct {
+ smx_comm_t comm;
+ } wait;
+
+ struct {
+ smx_comm_t comm;
+ } test;
+
+ struct {
+ xbt_dynar_t comms;
+ } waitany;
+
+ struct {
+ int value;
+ } random;
+ };
} s_mc_transition_t;
+mc_transition_t MC_trans_isend_new(smx_rdv_t);
+mc_transition_t MC_trans_irecv_new(smx_rdv_t);
+mc_transition_t MC_trans_wait_new(smx_comm_t);
+mc_transition_t MC_trans_test_new(smx_comm_t);
+mc_transition_t MC_trans_waitany_new(xbt_dynar_t);
+mc_transition_t MC_trans_random_new(int);
void MC_transition_delete(mc_transition_t);
int MC_transition_depend(mc_transition_t, mc_transition_t);
+void MC_trans_compute_enabled(xbt_setset_set_t, xbt_setset_set_t);
/******************************** States **************************************/
-typedef struct mc_state{
- xbt_setset_set_t transitions;
- xbt_setset_set_t enabled_transitions;
- xbt_setset_set_t interleave;
- xbt_setset_set_t done;
- mc_transition_t executed_transition;
+typedef struct mc_state {
+ xbt_setset_set_t created_transitions; /* created in this state */
+ xbt_setset_set_t transitions; /* created in this state + inherited */
+ xbt_setset_set_t enabled_transitions; /* they can be executed by the mc */
+ xbt_setset_set_t interleave; /* the ones to be executed by the mc */
+ xbt_setset_set_t done; /* already executed transitions */
+ mc_transition_t executed_transition; /* last executed transition */
} s_mc_state_t, *mc_state_t;
extern xbt_fifo_t mc_stack;
extern xbt_setset_t mc_setset;
+extern mc_state_t mc_current_state;
mc_state_t MC_state_new(void);
void MC_state_delete(mc_state_t);
/****************************** Statistics ************************************/
-typedef struct mc_stats{
+typedef struct mc_stats {
unsigned long state_size;
unsigned long visited_states;
unsigned long expanded_states;
unsigned long executed_transitions;
-}s_mc_stats_t, *mc_stats_t;
+} s_mc_stats_t, *mc_stats_t;
extern mc_stats_t mc_stats;
/* Normally the system should operate in std, for switching to raw mode */
/* you must wrap the code between MC_SET_RAW_MODE and MC_UNSET_RAW_MODE */
-extern void *actual_heap;
extern void *std_heap;
extern void *raw_heap;
extern void *libsimgrid_data_addr_start;
extern size_t libsimgrid_data_size;
-#define MC_SET_RAW_MEM actual_heap = raw_heap
-#define MC_UNSET_RAW_MEM actual_heap = std_heap
+#define MC_SET_RAW_MEM mmalloc_set_current_heap(raw_heap)
+#define MC_UNSET_RAW_MEM mmalloc_set_current_heap(std_heap)
/******************************* MEMORY MAPPINGS ***************************/
/* These functions and data structures implements a binary interface for */
#define MAP_WRITE 1 << 1
#define MAP_EXEC 1 << 2
#define MAP_SHARED 1 << 3
-#define MAP_PRIV 1 << 4
+#define MAP_PRIV 1 << 4
/* Each field is defined as documented in proc's manual page */
typedef struct s_map_region {
- void *start_addr; /* Start address of the map */
- void *end_addr; /* End address of the map */
- int perms; /* Set of permissions */
- void *offset; /* Offset in the file/whatever */
- char dev_major; /* Major of the device */
- char dev_minor; /* Minor of the device */
- unsigned long inode; /* Inode in the device */
- char *pathname; /* Path name of the mapped file */
+ void *start_addr; /* Start address of the map */
+ void *end_addr; /* End address of the map */
+ int perms; /* Set of permissions */
+ void *offset; /* Offset in the file/whatever */
+ char dev_major; /* Major of the device */
+ char dev_minor; /* Minor of the device */
+ unsigned long inode; /* Inode in the device */
+ char *pathname; /* Path name of the mapped file */
} s_map_region;
typedef struct s_memory_map {
- s_map_region *regions; /* Pointer to an array of regions */
- int mapsize; /* Number of regions in the memory */
+ s_map_region *regions; /* Pointer to an array of regions */
+ int mapsize; /* Number of regions in the memory */
} s_memory_map_t, *memory_map_t;