-#include "xbt/time.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_base, smpi,
- "Logging specific to SMPI (base)");
-XBT_LOG_EXTERNAL_CATEGORY(smpi_base);
-XBT_LOG_EXTERNAL_CATEGORY(smpi_bench);
-XBT_LOG_EXTERNAL_CATEGORY(smpi_kernel);
-XBT_LOG_EXTERNAL_CATEGORY(smpi_mpi);
-XBT_LOG_EXTERNAL_CATEGORY(smpi_mpi_dt);
-XBT_LOG_EXTERNAL_CATEGORY(smpi_coll);
-XBT_LOG_EXTERNAL_CATEGORY(smpi_receiver);
-XBT_LOG_EXTERNAL_CATEGORY(smpi_sender);
-XBT_LOG_EXTERNAL_CATEGORY(smpi_util);
+#include "xbt/virtu.h"
+#include "mc/mc.h"
+#include "xbt/replay.h"
+#include <errno.h>
+#include "simix/smx_private.h"
+#include "surf/surf.h"
+#include "simgrid/sg_config.h"
+
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_base, smpi, "Logging specific to SMPI (base)");
+
+
+static int match_recv(void* a, void* b, smx_action_t ignored) {
+ MPI_Request ref = (MPI_Request)a;
+ MPI_Request req = (MPI_Request)b;
+ XBT_DEBUG("Trying to match a recv of src %d against %d, tag %d against %d",ref->src,req->src, ref->tag, req->tag);
+
+ xbt_assert(ref, "Cannot match recv against null reference");
+ xbt_assert(req, "Cannot match recv against null request");
+ if((ref->src == MPI_ANY_SOURCE || req->src == ref->src)
+ && (ref->tag == MPI_ANY_TAG || req->tag == ref->tag)){
+ //we match, we can transfer some values
+ // FIXME : move this to the copy function ?
+ if(ref->src == MPI_ANY_SOURCE)ref->real_src = req->src;
+ if(ref->tag == MPI_ANY_TAG)ref->real_tag = req->tag;
+ if(ref->real_size < req->real_size) ref->truncated = 1;
+ if(req->detached==1){
+ ref->detached_sender=req; //tie the sender to the receiver, as it is detached and has to be freed in the receiver
+ }
+ return 1;
+ }else return 0;
+}
+
+static int match_send(void* a, void* b,smx_action_t ignored) {
+ MPI_Request ref = (MPI_Request)a;
+ MPI_Request req = (MPI_Request)b;
+ XBT_DEBUG("Trying to match a send of src %d against %d, tag %d against %d",ref->src,req->src, ref->tag, req->tag);
+ xbt_assert(ref, "Cannot match send against null reference");
+ xbt_assert(req, "Cannot match send against null request");
+
+ if((req->src == MPI_ANY_SOURCE || req->src == ref->src)
+ && (req->tag == MPI_ANY_TAG || req->tag == ref->tag))
+ {
+ if(req->src == MPI_ANY_SOURCE)req->real_src = ref->src;
+ if(req->tag == MPI_ANY_TAG)req->real_tag = ref->tag;
+ if(req->real_size < ref->real_size) req->truncated = 1;
+ if(ref->detached==1){
+ req->detached_sender=ref; //tie the sender to the receiver, as it is detached and has to be freed in the receiver
+ }
+
+ return 1;
+ } else return 0;
+}