Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Save another bunch of new/delete.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Wed, 25 Nov 2020 14:07:38 +0000 (15:07 +0100)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Wed, 25 Nov 2020 14:25:28 +0000 (15:25 +0100)
src/smpi/include/smpi_request.hpp
src/smpi/mpi/smpi_request.cpp

index 9e6bb45..5b95106 100644 (file)
@@ -9,6 +9,8 @@
 #include "smpi/smpi.h"
 #include "smpi_f2c.hpp"
 
+#include <memory>
+
 namespace simgrid{
 namespace smpi{
 
@@ -47,7 +49,7 @@ class Request : public F2C {
   int refcount_;
   MPI_Op op_;
   int cancelled_; // tri-state
-  smpi_mpi_generalized_request_funcs_t* generalized_funcs;
+  std::unique_ptr<smpi_mpi_generalized_request_funcs_t> generalized_funcs;
   MPI_Request* nbc_requests_;
   int nbc_requests_size_;
   static bool match_common(MPI_Request req, MPI_Request sender, MPI_Request receiver);
index e0c6ec5..df1f75b 100644 (file)
@@ -62,7 +62,6 @@ Request::Request(const void* buf, int count, MPI_Datatype datatype, int src, int
   else
     refcount_ = 0;
   cancelled_ = 0;
-  generalized_funcs=nullptr;
   nbc_requests_=nullptr;
   nbc_requests_size_=0;
   init_buffer(count);
@@ -83,7 +82,6 @@ void Request::unref(MPI_Request* request)
     if((*request)->refcount_==0){
       if ((*request)->flags_ & MPI_REQ_GENERALIZED){
         ((*request)->generalized_funcs)->free_fn(((*request)->generalized_funcs)->extra_state);
-        delete (*request)->generalized_funcs;
       }else{
         Comm::unref((*request)->comm_);
         Datatype::unref((*request)->old_type_);
@@ -594,16 +592,15 @@ int Request::test(MPI_Request * request, MPI_Status * status, int* flag) {
     if (*flag) {
       finish_wait(request,status);
       if (*request != MPI_REQUEST_NULL && ((*request)->flags_ & MPI_REQ_GENERALIZED)){
+        MPI_Status tmp_status;
         MPI_Status* mystatus;
-        if(status==MPI_STATUS_IGNORE){
-          mystatus=new MPI_Status();
+        if (status == MPI_STATUS_IGNORE) {
+          mystatus = &tmp_status;
           Status::empty(mystatus);
-        }else{
-          mystatus=status;
+        } else {
+          mystatus = status;
         }
         ret = ((*request)->generalized_funcs)->query_fn(((*request)->generalized_funcs)->extra_state, mystatus);
-        if(status==MPI_STATUS_IGNORE) 
-          delete mystatus;
       }
       nsleeps=1;//reset the number of sleeps we will do next time
       if (*request != MPI_REQUEST_NULL && ((*request)->flags_ & MPI_REQ_PERSISTENT) == 0)
@@ -686,16 +683,15 @@ int Request::testany(int count, MPI_Request requests[], int *index, int* flag, M
       } else {
         finish_wait(&requests[*index],status);
       if (requests[*index] != MPI_REQUEST_NULL && (requests[*index]->flags_ & MPI_REQ_GENERALIZED)){
+        MPI_Status tmp_status;
         MPI_Status* mystatus;
-        if(status==MPI_STATUS_IGNORE){
-          mystatus=new MPI_Status();
+        if (status == MPI_STATUS_IGNORE) {
+          mystatus = &tmp_status;
           Status::empty(mystatus);
-        }else{
-          mystatus=status;
+        } else {
+          mystatus = status;
         }
         ret=(requests[*index]->generalized_funcs)->query_fn((requests[*index]->generalized_funcs)->extra_state, mystatus);
-        if(status==MPI_STATUS_IGNORE) 
-          delete mystatus;
       }
 
         if (requests[*index] != MPI_REQUEST_NULL && (requests[*index]->flags_ & MPI_REQ_NON_PERSISTENT)) 
@@ -945,21 +941,20 @@ int Request::wait(MPI_Request * request, MPI_Status * status)
   }
 
   if (*request != MPI_REQUEST_NULL && ((*request)->flags_ & MPI_REQ_GENERALIZED)){
-    MPI_Status* mystatus;
     if(!((*request)->flags_ & MPI_REQ_COMPLETE)){
       ((*request)->generalized_funcs)->mutex->lock();
       ((*request)->generalized_funcs)->cond->wait(((*request)->generalized_funcs)->mutex);
       ((*request)->generalized_funcs)->mutex->unlock();
-      }
-    if(status==MPI_STATUS_IGNORE){
-      mystatus=new MPI_Status();
+    }
+    MPI_Status tmp_status;
+    MPI_Status* mystatus;
+    if (status == MPI_STATUS_IGNORE) {
+      mystatus = &tmp_status;
       Status::empty(mystatus);
-    }else{
-      mystatus=status;
+    } else {
+      mystatus = status;
     }
     ret = ((*request)->generalized_funcs)->query_fn(((*request)->generalized_funcs)->extra_state, mystatus);
-    if(status==MPI_STATUS_IGNORE) 
-      delete mystatus;
   }
 
   finish_wait(request,status);
@@ -1165,7 +1160,7 @@ int Request::grequest_start(MPI_Grequest_query_function* query_fn, MPI_Grequest_
   (*request)->flags_ |= MPI_REQ_GENERALIZED;
   (*request)->flags_ |= MPI_REQ_PERSISTENT;
   (*request)->refcount_ = 1;
-  ((*request)->generalized_funcs)             = new smpi_mpi_generalized_request_funcs_t;
+  ((*request)->generalized_funcs)             = std::make_unique<smpi_mpi_generalized_request_funcs_t>();
   ((*request)->generalized_funcs)->query_fn=query_fn;
   ((*request)->generalized_funcs)->free_fn=free_fn;
   ((*request)->generalized_funcs)->cancel_fn=cancel_fn;