#define MC_PRIVATE_H
#include <stdio.h>
+#include <sys/mman.h>
#include "mc/mc.h"
#include "mc/datatypes.h"
#include "xbt/fifo.h"
-#include "xbt/setset.h"
#include "xbt/config.h"
#include "xbt/function_types.h"
#include "xbt/mmalloc.h"
/****************************** Snapshots ***********************************/
-/*typedef struct s_mc_process_checkpoint {
- xbt_checkpoint_t machine_state; Here we save the cpu + stack
-} s_mc_process_checkpoint_t, *mc_process_checkpoint_t;*/
-
-typedef struct s_mc_snapshot {
- size_t heap_size;
- size_t data_size;
+typedef struct s_mc_mem_region{
+ void *start_addr;
void *data;
- void *heap;
+ size_t size;
+} s_mc_mem_region_t, *mc_mem_region_t;
+typedef struct s_mc_snapshot{
+ unsigned int num_reg;
+ mc_mem_region_t *regions;
} s_mc_snapshot_t, *mc_snapshot_t;
-extern mc_snapshot_t initial_snapshot;
-
-size_t MC_save_heap(void **);
-void MC_restore_heap(void *, size_t);
-
-size_t MC_save_dataseg(void **);
-void MC_restore_dataseg(void *, size_t);
-
void MC_take_snapshot(mc_snapshot_t);
void MC_restore_snapshot(mc_snapshot_t);
void MC_free_snapshot(mc_snapshot_t);
/********************************* MC Global **********************************/
+extern double *mc_time;
/* Bound of the MC depth-first search algorithm */
#define MAX_DEPTH 1000
-extern char mc_replay_mode;
-
+int MC_deadlock_check(void);
+void MC_replay(xbt_fifo_t stack);
+void MC_wait_for_requests(void);
+void MC_get_enabled_processes();
+void MC_show_deadlock(smx_req_t req);
void MC_show_stack(xbt_fifo_t stack);
void MC_dump_stack(xbt_fifo_t stack);
-void MC_execute_surf_actions(void);
-void MC_replay(xbt_fifo_t stack);
-void MC_schedule_enabled_processes(void);
-void MC_dfs_init(void);
+
+/********************************* Requests ***********************************/
+int MC_request_depend(smx_req_t req1, smx_req_t req2);
+char* MC_request_to_string(smx_req_t req, int value);
+unsigned int MC_request_testany_fail(smx_req_t req);
+/*int MC_waitany_is_enabled_by_comm(smx_req_t req, unsigned int comm);*/
+int MC_request_is_visible(smx_req_t req);
+int MC_request_is_enabled(smx_req_t req);
+int MC_request_is_enabled_by_idx(smx_req_t req, unsigned int idx);
+int MC_process_is_enabled(smx_process_t process);
+
+/********************************** DPOR **************************************/
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 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;
- smx_process_t process;
- 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 **************************************/
+/* Possible exploration status of a process in a state */
+typedef enum {
+ MC_NOT_INTERLEAVE=0, /* Do not interleave (do not execute) */
+ MC_INTERLEAVE, /* Interleave the process (one or more request) */
+ MC_DONE /* Already interleaved */
+} e_mc_process_state_t;
+
+/* On every state, each process has an entry of the following type */
+typedef struct mc_procstate{
+ e_mc_process_state_t state; /* Exploration control information */
+ unsigned int interleave_count; /* Number of times that the process was
+ interleaved */
+} s_mc_procstate_t, *mc_procstate_t;
+
+/* An exploration state is composed of: */
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 */
+ unsigned long max_pid; /* Maximum pid at state's creation time */
+ mc_procstate_t proc_status; /* State's exploration status by process */
+ s_smx_action_t internal_comm; /* To be referenced by the internal_req */
+ s_smx_req_t internal_req; /* Internal translation of request */
+ s_smx_req_t executed_req; /* The executed request of the state */
+ int req_num; /* The request number (in the case of a
+ multi-request like waitany ) */
} 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);
+void MC_state_delete(mc_state_t state);
+void MC_state_interleave_process(mc_state_t state, smx_process_t process);
+unsigned int MC_state_interleave_size(mc_state_t state);
+int MC_state_process_is_done(mc_state_t state, smx_process_t process);
+void MC_state_set_executed_request(mc_state_t state, smx_req_t req, int value);
+smx_req_t MC_state_get_executed_request(mc_state_t state, int *value);
+smx_req_t MC_state_get_internal_request(mc_state_t state);
+smx_req_t MC_state_get_request(mc_state_t state, int *value);
/****************************** Statistics ************************************/
typedef struct mc_stats {
extern void *std_heap;
extern void *raw_heap;
-extern void *libsimgrid_data_addr_start;
-extern size_t libsimgrid_data_size;
+int raw_heap_fd;
+#define STD_HEAP_SIZE 20480000 /* Maximum size of the system's heap */
+
+/* FIXME: Horrible hack! because the mmalloc library doesn't provide yet of */
+/* an API to query about the status of a heap, we simply call mmstats and */
+/* because I now how does structure looks like, then I redefine it here */
+
+struct mstats {
+ size_t bytes_total; /* Total size of the heap. */
+ size_t chunks_used; /* Chunks allocated by the user. */
+ size_t bytes_used; /* Byte total of user-allocated chunks. */
+ size_t chunks_free; /* Chunks in the free list. */
+ size_t bytes_free; /* Byte total of chunks in the free list. */
+};
#define MC_SET_RAW_MEM mmalloc_set_current_heap(raw_heap)
#define MC_UNSET_RAW_MEM mmalloc_set_current_heap(std_heap)
/* These functions and data structures implements a binary interface for */
/* the proc maps ascii interface */
-#define MAP_READ 1 << 0
-#define MAP_WRITE 1 << 1
-#define MAP_EXEC 1 << 2
-#define MAP_SHARED 1 << 3
-#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 */
+ int prot; /* Memory protection */
+ int flags; /* Aditional memory flags */
void *offset; /* Offset in the file/whatever */
char dev_major; /* Major of the device */
char dev_minor; /* Minor of the device */