Avoids segfaults in this case
+#define CHECK_ACTION_PARAMS(action, mandatory, optional) {\
+ int i=0;\
+ while(action[i]!=NULL)\
+ i++;\
+ if(i<mandatory+2) \
+ THROWF(arg_error, 0, "%s replay failed.\n" \
+ "%d items were given on the line. First two should be process_id and action. " \
+ "This action needs after them %d mandatory arguments, and accepts %d optional ones. \n" \
+ "Please contact the Simgrid team if support is needed", __FUNCTION__, i, mandatory, optional);\
+ }
+
+
static void action_init(const char *const *action)
{
int i;
XBT_DEBUG("Initialize the counters");
static void action_init(const char *const *action)
{
int i;
XBT_DEBUG("Initialize the counters");
+ CHECK_ACTION_PARAMS(action, 0, 1);
if(action[2]) MPI_DEFAULT_TYPE= MPI_DOUBLE; // default MPE dataype
else MPI_DEFAULT_TYPE= MPI_BYTE; // default TAU datatype
if(action[2]) MPI_DEFAULT_TYPE= MPI_DOUBLE; // default MPE dataype
else MPI_DEFAULT_TYPE= MPI_BYTE; // default TAU datatype
static void action_compute(const char *const *action)
{
static void action_compute(const char *const *action)
{
+ CHECK_ACTION_PARAMS(action, 1, 0);
double clock = smpi_process_simulated_elapsed();
double flops= parse_double(action[2]);
#ifdef HAVE_TRACING
double clock = smpi_process_simulated_elapsed();
double flops= parse_double(action[2]);
#ifdef HAVE_TRACING
static void action_send(const char *const *action)
{
static void action_send(const char *const *action)
{
+ CHECK_ACTION_PARAMS(action, 2, 1);
int to = atoi(action[2]);
double size=parse_double(action[3]);
double clock = smpi_process_simulated_elapsed();
int to = atoi(action[2]);
double size=parse_double(action[3]);
double clock = smpi_process_simulated_elapsed();
static void action_Isend(const char *const *action)
{
static void action_Isend(const char *const *action)
{
+ CHECK_ACTION_PARAMS(action, 2, 1);
int to = atoi(action[2]);
double size=parse_double(action[3]);
double clock = smpi_process_simulated_elapsed();
int to = atoi(action[2]);
double size=parse_double(action[3]);
double clock = smpi_process_simulated_elapsed();
}
static void action_recv(const char *const *action) {
}
static void action_recv(const char *const *action) {
+ CHECK_ACTION_PARAMS(action, 2, 1);
int from = atoi(action[2]);
double size=parse_double(action[3]);
double clock = smpi_process_simulated_elapsed();
int from = atoi(action[2]);
double size=parse_double(action[3]);
double clock = smpi_process_simulated_elapsed();
static void action_Irecv(const char *const *action)
{
static void action_Irecv(const char *const *action)
{
+ CHECK_ACTION_PARAMS(action, 2, 1);
int from = atoi(action[2]);
double size=parse_double(action[3]);
double clock = smpi_process_simulated_elapsed();
int from = atoi(action[2]);
double size=parse_double(action[3]);
double clock = smpi_process_simulated_elapsed();
}
static void action_test(const char *const *action){
}
static void action_test(const char *const *action){
+ CHECK_ACTION_PARAMS(action, 0, 0);
double clock = smpi_process_simulated_elapsed();
MPI_Request request;
MPI_Status status;
double clock = smpi_process_simulated_elapsed();
MPI_Request request;
MPI_Status status;
}
static void action_wait(const char *const *action){
}
static void action_wait(const char *const *action){
+ CHECK_ACTION_PARAMS(action, 0, 0);
double clock = smpi_process_simulated_elapsed();
MPI_Request request;
MPI_Status status;
double clock = smpi_process_simulated_elapsed();
MPI_Request request;
MPI_Status status;
}
static void action_waitall(const char *const *action){
}
static void action_waitall(const char *const *action){
+ CHECK_ACTION_PARAMS(action, 0, 0);
double clock = smpi_process_simulated_elapsed();
int count_requests=0;
unsigned int i=0;
double clock = smpi_process_simulated_elapsed();
int count_requests=0;
unsigned int i=0;
static void action_bcast(const char *const *action)
{
static void action_bcast(const char *const *action)
{
+ CHECK_ACTION_PARAMS(action, 1, 2);
double size = parse_double(action[2]);
double clock = smpi_process_simulated_elapsed();
int root=0;
double size = parse_double(action[2]);
double clock = smpi_process_simulated_elapsed();
int root=0;
static void action_reduce(const char *const *action)
{
static void action_reduce(const char *const *action)
{
+ CHECK_ACTION_PARAMS(action, 2, 2);
double comm_size = parse_double(action[2]);
double comp_size = parse_double(action[3]);
double clock = smpi_process_simulated_elapsed();
double comm_size = parse_double(action[2]);
double comp_size = parse_double(action[3]);
double clock = smpi_process_simulated_elapsed();
}
static void action_allReduce(const char *const *action) {
}
static void action_allReduce(const char *const *action) {
+ CHECK_ACTION_PARAMS(action, 2, 1);
double comm_size = parse_double(action[2]);
double comp_size = parse_double(action[3]);
double comm_size = parse_double(action[2]);
double comp_size = parse_double(action[3]);
4) 0 is the send datatype id, see decode_datatype()
5) 0 is the recv datatype id, see decode_datatype()
*/
4) 0 is the send datatype id, see decode_datatype()
5) 0 is the recv datatype id, see decode_datatype()
*/
+ CHECK_ACTION_PARAMS(action, 2, 3);
double clock = smpi_process_simulated_elapsed();
int comm_size = smpi_comm_size(MPI_COMM_WORLD);
int send_size = parse_double(action[2]);
double clock = smpi_process_simulated_elapsed();
int comm_size = smpi_comm_size(MPI_COMM_WORLD);
int send_size = parse_double(action[2]);
4) 0 is the send datatype id, see decode_datatype()
5) 0 is the recv datatype id, see decode_datatype()
*/
4) 0 is the send datatype id, see decode_datatype()
5) 0 is the recv datatype id, see decode_datatype()
*/
double clock = smpi_process_simulated_elapsed();
int comm_size = smpi_comm_size(MPI_COMM_WORLD);
double clock = smpi_process_simulated_elapsed();
int comm_size = smpi_comm_size(MPI_COMM_WORLD);
+ CHECK_ACTION_PARAMS(action, comm_size+1, 2);
int send_size = parse_double(action[2]);
int *disps = xbt_new0(int, comm_size);
int *recvcounts = xbt_new0(int, comm_size);
int send_size = parse_double(action[2]);
int *disps = xbt_new0(int, comm_size);
int *recvcounts = xbt_new0(int, comm_size);
double clock = smpi_process_simulated_elapsed();
int comm_size = smpi_comm_size(MPI_COMM_WORLD);
double clock = smpi_process_simulated_elapsed();
int comm_size = smpi_comm_size(MPI_COMM_WORLD);
+ CHECK_ACTION_PARAMS(action, comm_size+1, 1);
int comp_size = parse_double(action[2+comm_size]);
int *recvcounts = xbt_new0(int, comm_size);
int *disps = xbt_new0(int, comm_size);
int comp_size = parse_double(action[2+comm_size]);
int *recvcounts = xbt_new0(int, comm_size);
int *disps = xbt_new0(int, comm_size);
double clock = smpi_process_simulated_elapsed();
double clock = smpi_process_simulated_elapsed();
- int comm_size = smpi_comm_size(MPI_COMM_WORLD);
+ CHECK_ACTION_PARAMS(action, 2, 2);
int sendcount=atoi(action[2]);
int recvcount=atoi(action[3]);
MPI_Datatype MPI_CURRENT_TYPE2;
if(action[4]) {
int sendcount=atoi(action[2]);
int recvcount=atoi(action[3]);
MPI_Datatype MPI_CURRENT_TYPE2;
if(action[4]) {
- MPI_CURRENT_TYPE = decode_datatype(action[3+comm_size]);
- MPI_CURRENT_TYPE2 = decode_datatype(action[4+comm_size]);
+ MPI_CURRENT_TYPE = decode_datatype(action[3]);
+ MPI_CURRENT_TYPE2 = decode_datatype(action[4]);
} else {
MPI_CURRENT_TYPE = MPI_DEFAULT_TYPE;
MPI_CURRENT_TYPE2 = MPI_DEFAULT_TYPE;
} else {
MPI_CURRENT_TYPE = MPI_DEFAULT_TYPE;
MPI_CURRENT_TYPE2 = MPI_DEFAULT_TYPE;
extra->recv_size= recvcount;
extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2);
extra->recv_size= recvcount;
extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2);
- extra->num_processes = comm_size;
+ extra->num_processes = smpi_comm_size(MPI_COMM_WORLD);
TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra);
#endif
TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra);
#endif
double clock = smpi_process_simulated_elapsed();
int comm_size = smpi_comm_size(MPI_COMM_WORLD);
double clock = smpi_process_simulated_elapsed();
int comm_size = smpi_comm_size(MPI_COMM_WORLD);
+ CHECK_ACTION_PARAMS(action, comm_size+1, 2);
int i=0;
int sendcount=atoi(action[2]);
int *recvcounts = xbt_new0(int, comm_size);
int i=0;
int sendcount=atoi(action[2]);
int *recvcounts = xbt_new0(int, comm_size);
double clock = smpi_process_simulated_elapsed();
int comm_size = smpi_comm_size(MPI_COMM_WORLD);
double clock = smpi_process_simulated_elapsed();
int comm_size = smpi_comm_size(MPI_COMM_WORLD);
+ CHECK_ACTION_PARAMS(action, 2*comm_size+2, 2);
int send_buf_size=0,recv_buf_size=0,i=0;
int *sendcounts = xbt_new0(int, comm_size);
int *recvcounts = xbt_new0(int, comm_size);
int send_buf_size=0,recv_buf_size=0,i=0;
int *sendcounts = xbt_new0(int, comm_size);
int *recvcounts = xbt_new0(int, comm_size);
char *line;
size_t line_len;
char *position; /* stable storage */
char *line;
size_t line_len;
char *position; /* stable storage */
- char *filename; int linenum;
+ char *filename;
+ int linenum;
} s_xbt_replay_reader_t;
FILE *action_fp;
} s_xbt_replay_reader_t;
FILE *action_fp;
int xbt_replay_action_runner(int argc, char *argv[])
{
int i;
int xbt_replay_action_runner(int argc, char *argv[])
{
int i;
if (action_fp) { // A unique trace file
char **evt;
while ((evt = action_get_action(argv[0]))) {
if (action_fp) { // A unique trace file
char **evt;
while ((evt = action_get_action(argv[0]))) {
action_fun function =
(action_fun)xbt_dict_get(action_funs, lowername);
xbt_free(lowername);
action_fun function =
(action_fun)xbt_dict_get(action_funs, lowername);
xbt_free(lowername);
- function((const char **)evt);
+ TRY{
+ function((const char **)evt);
+ }
+ CATCH(e) {
+ XBT_ERROR("Replay error :\n %s"
+ , e.msg);
+ xbt_ex_free(e);
+ RETHROW;
+ }
for (i=0;evt[i]!= NULL;i++)
free(evt[i]);
free(evt);
for (i=0;evt[i]!= NULL;i++)
free(evt[i]);
free(evt);
char* lowername = str_tolower (evt[1]);
action_fun function = (action_fun)xbt_dict_get(action_funs, lowername);
xbt_free(lowername);
char* lowername = str_tolower (evt[1]);
action_fun function = (action_fun)xbt_dict_get(action_funs, lowername);
xbt_free(lowername);
+ TRY{
+ function(evt);
+ }
+ CATCH(e) {
+ free(evt);
+ xbt_die("Replay error on line %d of file %s :\n %s"
+ , reader->linenum,reader->filename, e.msg);
+ }
} else {
XBT_WARN("%s: Ignore trace element not for me",
xbt_replay_reader_position(reader));
} else {
XBT_WARN("%s: Ignore trace element not for me",
xbt_replay_reader_position(reader));