X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3c5b31c9766da42c82473b8c9dbf5910b74f3cb0..814f0122ea0074dfb67398a79067c01267bc0b40:/src/mc/mc_protocol.h diff --git a/src/mc/mc_protocol.h b/src/mc/mc_protocol.h index ba8014500b..722c71d080 100644 --- a/src/mc/mc_protocol.h +++ b/src/mc/mc_protocol.h @@ -9,6 +9,8 @@ #include +#include "mc/datatypes.h" + SG_BEGIN_DECL() // ***** Environment variables for passing context to the model-checked process @@ -21,23 +23,93 @@ SG_BEGIN_DECL() /** Environment variable name used to pass the communication socket */ #define MC_ENV_SOCKET_FD "SIMGRID_MC_SOCKET_FD" +// ***** MC mode + +typedef enum { + MC_MODE_NONE = 0, + MC_MODE_CLIENT, + MC_MODE_SERVER +} e_mc_mode_t; + +extern e_mc_mode_t mc_mode; + // ***** Messages -enum { - MC_MESSAGE_NONE = 0, - MC_MESSAGE_HELLO = 1, - MC_MESSAGE_CONTINUE = 2, -}; +typedef enum { + MC_MESSAGE_NONE, + MC_MESSAGE_HELLO, + MC_MESSAGE_CONTINUE, + MC_MESSAGE_IGNORE_HEAP, + MC_MESSAGE_UNIGNORE_HEAP, + MC_MESSAGE_IGNORE_MEMORY, + MC_MESSAGE_STACK_REGION, + MC_MESSAGE_REGISTER_SYMBOL, + MC_MESSAGE_DEADLOCK_CHECK, + MC_MESSAGE_DEADLOCK_CHECK_REPLY, + MC_MESSAGE_WAITING, + MC_MESSAGE_SIMCALL_HANDLE, + MC_MESSAGE_ASSERTION_FAILED, +} e_mc_message_type; +#define MC_MESSAGE_LENGTH 512 + +/** Basic structure for a MC message + * + * The current version of the client/server protocol sends C structures over `AF_LOCAL` + * `SOCK_DGRAM` sockets. This means that the protocol is ABI/architecture specific: + * we currently can't model-check a x86 process from a x86_64 process. + * + * Moreover the protocol is not stable. The same version of the library should be used + * for the client and the server. + * + * This is the basic structure shared by all messages: all message start with a message + * type. + */ typedef struct s_mc_message { - int type; + e_mc_message_type type; } s_mc_message_t, *mc_message_t; -/** - * @return errno - */ -int MC_protocol_send_simple_message(int socket, int type); +typedef struct s_mc_int_message { + e_mc_message_type type; + uint64_t value; +} s_mc_int_message_t, *mc_int_message_t; + +typedef struct s_mc_ignore_heap_message { + e_mc_message_type type; + s_mc_heap_ignore_region_t region; +} s_mc_ignore_heap_message_t, *mc_ignore_heap_message_t; + +typedef struct s_mc_ignore_memory_message { + e_mc_message_type type; + void *addr; + size_t size; +} s_mc_ignore_memory_message_t, *mc_ignore_memory_message_t; + +typedef struct s_mc_stack_region_message { + e_mc_message_type type; + s_stack_region_t stack_region; +} s_mc_stack_region_message_t, *mc_stack_region_message_t; + +typedef struct s_mc_simcall_handle_message { + e_mc_message_type type; + unsigned long pid; + int value; +} s_mc_simcall_handle_message_t, *mc_simcall_handle_message; + +typedef struct s_mc_register_symbol_message { + e_mc_message_type type; + char name[128]; + int (*callback)(void*); + void* data; +} s_mc_register_symbol_message_t, * mc_register_symbol_message_t; + +int MC_protocol_send(int socket, void* message, size_t size); +int MC_protocol_send_simple_message(int socket, e_mc_message_type type); int MC_protocol_hello(int socket); +ssize_t MC_receive_message(int socket, void* message, size_t size, int options); + +const char* MC_message_type_name(e_mc_message_type type); +const char* MC_mode_name(e_mc_mode_t mode); SG_END_DECL()