Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
close the window if we explicitely tell it's closed
[simgrid.git] / src / smpi / smpi_request.cpp
index ab1b5f0..fd91cf4 100644 (file)
@@ -1,5 +1,4 @@
-/* Copyright (c) 2007-2015. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2007-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -109,7 +108,7 @@ namespace smpi{
 Request::Request(void *buf, int count, MPI_Datatype datatype, int src, int dst, int tag, MPI_Comm comm, unsigned flags) : buf_(buf), old_type_(datatype), src_(src), dst_(dst), tag_(tag), comm_(comm), flags_(flags) 
 {
   void *old_buf = nullptr;
-  if((((flags & RECV) != 0) && ((flags & ACCUMULATE) !=0)) || (datatype->flags() & DT_FLAG_DERIVED)){
+  if(((((flags & RECV) != 0) && ((flags & ACCUMULATE) !=0)) || (datatype->flags() & DT_FLAG_DERIVED)) && (!smpi_is_shared(buf_))){
     // This part handles the problem of non-contiguous memory
     old_buf = buf;
     buf_ = count==0 ? nullptr : xbt_malloc(count*datatype->size());
@@ -567,7 +566,7 @@ int Request::test(MPI_Request * request, MPI_Status * status) {
   if(smpi_test_sleep > 0)  
     simcall_process_sleep(nsleeps*smpi_test_sleep);
 
-  smpi_empty_status(status);
+  Status::empty(status);
   int flag = 1;
   if (((*request)->flags_ & PREPARED) == 0) {
     if ((*request)->action_ != nullptr)
@@ -650,7 +649,7 @@ int Request::testany(int count, MPI_Request requests[], int *index, MPI_Status *
   } else {
       //all requests are null or inactive, return true
       flag = 1;
-      smpi_empty_status(status);
+      Status::empty(status);
   }
 
   return flag;
@@ -669,7 +668,7 @@ int Request::testall(int count, MPI_Request requests[], MPI_Status status[])
           requests[i]=MPI_REQUEST_NULL;
       }
     }else{
-      smpi_empty_status(pstat);
+      Status::empty(pstat);
     }
     if(status != MPI_STATUSES_IGNORE) {
       status[i] = *pstat;
@@ -744,7 +743,7 @@ void Request::iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status*
 void Request::finish_wait(MPI_Request* request, MPI_Status * status)
 {
   MPI_Request req = *request;
-  smpi_empty_status(status);
+  Status::empty(status);
 
   if(!((req->detached_ != 0) && ((req->flags_ & SEND) != 0)) && ((req->flags_ & PREPARED) == 0)){
     if(status != MPI_STATUS_IGNORE) {
@@ -759,7 +758,8 @@ void Request::finish_wait(MPI_Request* request, MPI_Status * status)
     req->print_request("Finishing");
     MPI_Datatype datatype = req->old_type_;
 
-    if(((req->flags_ & ACCUMULATE) != 0) || (datatype->flags() & DT_FLAG_DERIVED)){
+    if((((req->flags_ & ACCUMULATE) != 0) || (datatype->flags() & DT_FLAG_DERIVED)) && (!smpi_is_shared(req->old_buf_))){
+
       if (!smpi_process()->replaying()){
         if( smpi_privatize_global_variables != 0 && (static_cast<char*>(req->old_buf_) >= smpi_start_data_exe)
             && ((char*)req->old_buf_ < smpi_start_data_exe + smpi_size_data_exe )){
@@ -805,7 +805,7 @@ void Request::wait(MPI_Request * request, MPI_Status * status)
 {
   (*request)->print_request("Waiting");
   if ((*request)->flags_ & PREPARED) {
-    smpi_empty_status(status);
+    Status::empty(status);
     return;
   }
 
@@ -861,8 +861,6 @@ int Request::waitany(int count, MPI_Request requests[], MPI_Status * status)
           finish_wait(&requests[index],status);
           if (requests[i] != MPI_REQUEST_NULL && (requests[i]->flags_ & NON_PERSISTENT))
             requests[index] = MPI_REQUEST_NULL;
-        }else{
-            XBT_WARN("huu?");
         }
       }
     }
@@ -872,14 +870,14 @@ int Request::waitany(int count, MPI_Request requests[], MPI_Status * status)
   }
 
   if (index==MPI_UNDEFINED)
-    smpi_empty_status(status);
+    Status::empty(status);
 
   return index;
 }
 
 static int sort_accumulates(MPI_Request a, MPI_Request b)
 {
-  return (a->tag() < b->tag());
+  return (a->tag() > b->tag());
 }
 
 int Request::waitall(int count, MPI_Request requests[], MPI_Status status[])
@@ -893,9 +891,9 @@ int Request::waitall(int count, MPI_Request requests[], MPI_Status status[])
   if (status != MPI_STATUSES_IGNORE) {
     for (int c = 0; c < count; c++) {
       if (requests[c] == MPI_REQUEST_NULL || requests[c]->dst_ == MPI_PROC_NULL || (requests[c]->flags_ & PREPARED)) {
-        smpi_empty_status(&status[c]);
+        Status::empty(&status[c]);
       } else if (requests[c]->src_ == MPI_PROC_NULL) {
-        smpi_empty_status(&status[c]);
+        Status::empty(&status[c]);
         status[c].MPI_SOURCE = MPI_PROC_NULL;
       }
     }