Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add new entry in Release_Notes.
[simgrid.git] / src / smpi / include / smpi_win.hpp
index ec89c1d..436bd27 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2018. The SimGrid Team.
+/* Copyright (c) 2010-2023. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -8,76 +8,82 @@
 #define SMPI_WIN_HPP_INCLUDED
 
 #include "simgrid/s4u/Barrier.hpp"
+#include "smpi_errhandler.hpp"
 #include "smpi_f2c.hpp"
 #include "smpi_keyvals.hpp"
-#include "xbt/synchro.h"
+#include "smpi_config.hpp"
 
 #include <vector>
 #include <list>
 
-namespace simgrid{
-namespace smpi{
+namespace simgrid::smpi {
 
 class Win : public F2C, public Keyval {
-  private :
   void* base_;
   MPI_Aint size_;
   int disp_unit_;
-  int assert_;
+  int assert_ = 0;
   MPI_Info info_;
   MPI_Comm comm_;
-  std::vector<MPI_Request> *requests_;
-  xbt_mutex_t mut_;
-  simgrid::s4u::Barrier* bar_;
-  MPI_Win* connected_wins_;
-  char* name_;
-  int opened_;
-  MPI_Group group_;
-  int count_; //for ordering the accs
-  xbt_mutex_t lock_mut_;
-  xbt_mutex_t atomic_mut_;
+  std::vector<MPI_Request> requests_;
+  s4u::MutexPtr mut_ = s4u::Mutex::create();
+  s4u::BarrierPtr bar_;
+  std::vector<MPI_Win> connected_wins_;
+  std::string name_;
+  int opened_               = 0;
+  MPI_Group src_group_      = MPI_GROUP_NULL; // for post/wait
+  MPI_Group dst_group_      = MPI_GROUP_NULL; // for start/complete
+  int count_                = 0; // for ordering the accs
+  s4u::MutexPtr lock_mut_   = s4u::Mutex::create();
+  s4u::MutexPtr atomic_mut_ = s4u::Mutex::create();
   std::list<int> lockers_;
   int rank_; // to identify owner for barriers in MPI_COMM_WORLD
-  int mode_; // exclusive or shared lock
-  int allocated_;
-  int dynamic_;
+  int mode_ = 0; // exclusive or shared lock
+  bool allocated_;
+  bool dynamic_;
+  MPI_Errhandler errhandler_ = _smpi_cfg_default_errhandler_is_error ? MPI_ERRORS_ARE_FATAL : MPI_ERRORS_RETURN;
 
 public:
   static std::unordered_map<int, smpi_key_elem> keyvals_;
   static int keyval_id_;
 
-  Win(void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, int allocated = 0, int dynamic = 0);
-  Win(MPI_Info info, MPI_Comm comm) : Win(MPI_BOTTOM, 0, 1, info, comm, 0, 1) {};
-  ~Win();
+  Win(void* base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, bool allocated = false,
+      bool dynamic = false);
+  Win(MPI_Info info, MPI_Comm comm) : Win(MPI_BOTTOM, 0, 1, info, comm, false, true){};
+  Win(const Win&) = delete;
+  Win& operator=(const Win&) = delete;
+  static int del(Win* win);
   int attach (void *base, MPI_Aint size);
-  int detach (void *base);
-  void get_name( char* name, int* length);
+  int detach (const void *base);
+  void get_name(char* name, int* length) const;
+  std::string name() const override { return name_.empty() ? "MPI_Win" : name_; }
   void get_group( MPI_Group* group);
-  void set_name( char* name);
-  int rank();
-  int dynamic();
+  void set_name(const char* name);
+  int rank() const;
+  MPI_Comm comm() const;
+  bool dynamic() const;
   int start(MPI_Group group, int assert);
   int post(MPI_Group group, int assert);
   int complete();
   MPI_Info info();
   void set_info( MPI_Info info);
   int wait();
-  MPI_Aint size();
-  void* base();
-  int disp_unit();
+  MPI_Aint size() const;
+  void* base() const;
+  int disp_unit() const;
   int fence(int assert);
-  int put( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
+  int opened() const {return opened_;}
+  int put(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
               MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Request* request=nullptr);
   int get( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
               MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Request* request=nullptr);
-  int accumulate( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
+  int accumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
               MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Request* request=nullptr);
-  int get_accumulate( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, void *result_addr,
+  int get_accumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, void *result_addr,
               int result_count, MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp, int target_count,
               MPI_Datatype target_datatype, MPI_Op op, MPI_Request* request=nullptr);
-  int compare_and_swap(void *origin_addr, void *compare_addr,
-        void *result_addr, MPI_Datatype datatype, int target_rank,
-        MPI_Aint target_disp);
+  int compare_and_swap(const void* origin_addr, const void* compare_addr, void* result_addr, MPI_Datatype datatype,
+                       int target_rank, MPI_Aint target_disp);
   static Win* f2c(int id);
 
   int lock(int lock_type, int rank, int assert);
@@ -90,11 +96,11 @@ public:
   int flush_local_all();
   int finish_comms();
   int finish_comms(int rank);
-  int shared_query(int rank, MPI_Aint* size, int* disp_unit, void* baseptr);
+  int shared_query(int rank, MPI_Aint* size, int* disp_unit, void* baseptr) const;
+  MPI_Errhandler errhandler();
+  void set_errhandler( MPI_Errhandler errhandler);
 };
 
-
-}
-}
+} // namespace simgrid::smpi
 
 #endif