source: XIOS3/dev/XIOS_FILE_SERVICES/src/manager/token_manager.hpp @ 2455

Last change on this file since 2455 was 2455, checked in by ymipsl, 17 months ago

Make coupling working again.
YM

  • Property svn:executable set to *
File size: 2.1 KB
Line 
1#ifndef __TOKEN_MANAGER_HPP__
2#define __TOKEN_MANAGER_HPP__
3
4#include "xios_spl.hpp"
5#include "exception.hpp"
6#include "mpi.hpp"
7
8namespace xios
9{
10
11  class CTokenManager
12  {
13
14    public:
15      CTokenManager(MPI_Comm& comm, int leader) : leader_(leader)
16      {
17        int commRank ;
18        MPI_Comm_rank(comm, &commRank) ;
19        MPI_Aint size = 0 ;
20        if (leader_== commRank) size = sizeof(size_t) ;
21        MPI_Win_create(&currentToken_, size, sizeof(size_t), MPI_INFO_NULL, comm, &winCurrentToken_) ;
22        MPI_Win_create(&retrievedToken_, size, sizeof(size_t), MPI_INFO_NULL, comm, &winRetrievedToken_) ;
23      }
24
25      size_t getToken(void)
26      {
27        size_t inc=1 ;
28        size_t token ;
29        MPI_Win_lock(MPI_LOCK_EXCLUSIVE, leader_, 0, winCurrentToken_) ;
30        MPI_Fetch_and_op(&inc, &token, MPI_SIZE_T, leader_, 0, MPI_SUM, winCurrentToken_) ;
31        MPI_Win_unlock(leader_, winCurrentToken_) ;
32        return token ;
33      }
34
35      bool lockToken(size_t token)
36      {
37        size_t tokenRead ;
38        MPI_Win_lock(MPI_LOCK_SHARED, leader_, 0, winRetrievedToken_) ;
39        MPI_Get(&tokenRead, 1, MPI_SIZE_T, leader_, 0, 1, MPI_SIZE_T, winRetrievedToken_ ) ;
40        MPI_Win_unlock(leader_, winRetrievedToken_) ;
41        if (token==tokenRead) return true ;
42        else return false ;
43      }
44
45      void unlockToken(size_t token)
46      {
47        size_t inc=1 ;
48        size_t tokenRead ;
49        MPI_Win_lock(MPI_LOCK_EXCLUSIVE, leader_, 0, winRetrievedToken_) ;
50        MPI_Fetch_and_op(&inc, &tokenRead, MPI_SIZE_T, leader_, 0, MPI_SUM, winRetrievedToken_) ;
51        MPI_Win_unlock(leader_, winRetrievedToken_) ;
52       
53        if (token!=tokenRead)  ERROR("void CTokenManager::unlockToken(size_t token)",<<"Cannot release token="<<token<<
54                                     " that is not corresponding to the locked token="<<tokenRead) ;     
55      }
56
57    private:
58
59      MPI_Win winCurrentToken_ ;
60      MPI_Win winRetrievedToken_ ;
61     
62      int leader_ ;
63
64      size_t currentToken_=0 ;
65      size_t retrievedToken_=0 ;
66
67
68  } ;
69
70
71}
72
73#endif
Note: See TracBrowser for help on using the repository browser.