1
5
6 #include "moab/Interface.hpp"
7 #include "SharedSetData.hpp"
8 #include <cassert>
9 #include <cstdio>
10 #include <cstdlib>
11
12 namespace moab
13 {
14
15 SharedSetData::SharedSetData( Interface& moab, int pcID, unsigned rank ) : mb( moab ), sharedSetTag( 0 )
16 {
17 SharedSetTagData zero;
18
19
20
21 memset( &zero, 0, sizeof( SharedSetTagData ) );
22
23 zero.ownerRank = rank;
24 zero.ownerHandle = 0;
25 zero.sharingProcs = NULL;
26
27
28
29 std::ostringstream sharedTagUniqueName;
30 sharedTagUniqueName << "__sharedSetTag" << pcID;
31 ErrorCode rval = mb.tag_get_handle( sharedTagUniqueName.str().c_str(), sizeof( SharedSetTagData ), MB_TYPE_OPAQUE,
32 sharedSetTag, MB_TAG_CREAT | MB_TAG_SPARSE, &zero );
33 assert( MB_SUCCESS == rval );
34 if( MB_SUCCESS != rval )
35 {
36 fprintf( stderr, "Aborted from the constructor of SharedSetData.\n" );
37 abort();
38 }
39 }
40
41 SharedSetData::~SharedSetData()
42 {
43 mb.tag_delete( sharedSetTag );
44 }
45
46 ErrorCode SharedSetData::get_owning_procs( std::vector< unsigned >& ranks_out ) const
47 {
48 ranks_out.clear();
49 ranks_out.reserve( handleMap.size() );
50 for( RHMap::const_iterator i = handleMap.begin(); i != handleMap.end(); ++i )
51 ranks_out.push_back( i->first );
52 return MB_SUCCESS;
53 }
54
55 ErrorCode SharedSetData::get_sharing_procs( EntityHandle entity_set, std::vector< unsigned >& ranks_out ) const
56 {
57 ErrorCode rval;
58 SharedSetTagData data;
59 rval = mb.tag_get_data( sharedSetTag, &entity_set, 1, &data );
60 if( MB_SUCCESS != rval ) return rval;
61
62 ranks_out.clear();
63 if( data.sharingProcs ) ranks_out = *data.sharingProcs;
64 return MB_SUCCESS;
65 }
66
67 ErrorCode SharedSetData::get_shared_sets( Range& sets_out ) const
68 {
69
70
71
72 sets_out.clear();
73 for( RHMap::const_iterator i = handleMap.begin(); i != handleMap.end(); ++i )
74 append_local_handles( i->second, sets_out );
75 return MB_SUCCESS;
76 }
77
78 ErrorCode SharedSetData::get_shared_sets( unsigned rank, Range& sets_out ) const
79 {
80 sets_out.clear();
81
82
83
84
85 RHMap::const_iterator i = handleMap.find( rank );
86 if( i != handleMap.end() ) append_local_handles( i->second, sets_out );
87 return MB_SUCCESS;
88
89 }
90
91 ErrorCode SharedSetData::get_owner( EntityHandle entity_set, unsigned& rank_out, EntityHandle& remote_handle_out ) const
92 {
93 ErrorCode rval;
94 SharedSetTagData data;
95 rval = mb.tag_get_data( sharedSetTag, &entity_set, 1, &data );
96 if( MB_SUCCESS != rval ) return rval;
97
98 if( !data.ownerHandle )
99 {
100 assert( !data.sharingProcs );
101 data.ownerHandle = entity_set;
102 }
103
104 rank_out = data.ownerRank;
105 remote_handle_out = data.ownerHandle;
106 return MB_SUCCESS;
107 }
108
109 ErrorCode SharedSetData::get_local_handle( unsigned owner_rank,
110 EntityHandle remote_handle,
111 EntityHandle& local_handle ) const
112 {
113 RHMap::const_iterator i = handleMap.find( owner_rank );
114 assert( i != handleMap.end() );
115 if( i == handleMap.end() )
116 {
117 local_handle = ~(EntityHandle)0;
118 return MB_FAILURE;
119 }
120
121 if( !i->second.find( remote_handle, local_handle ) )
122 {
123 assert( false );
124 local_handle = ~(EntityHandle)0;
125 return MB_FAILURE;
126 }
127
128 return MB_SUCCESS;
129 }
130
131 ErrorCode SharedSetData::set_owner( EntityHandle set, unsigned owner_rank, EntityHandle owner_handle )
132 {
133 ErrorCode rval;
134 SharedSetTagData data;
135 rval = mb.tag_get_data( sharedSetTag, &set, 1, &data );
136 if( MB_SUCCESS != rval ) return rval;
137
138 if( data.ownerHandle )
139 {
140 RHMap::iterator i = handleMap.find( data.ownerRank );
141 if( i != handleMap.end() )
142 {
143 i->second.erase( data.ownerHandle, 1 );
144 }
145 }
146
147 data.ownerRank = owner_rank;
148 data.ownerHandle = owner_handle;
149 rval = mb.tag_set_data( sharedSetTag, &set, 1, &data );
150 if( MB_SUCCESS != rval ) return rval;
151
152 if( !handleMap[owner_rank].insert( owner_handle, set, 1 ).second )
153 {
154 assert( false );
155 return MB_FAILURE;
156 }
157
158 return MB_SUCCESS;
159 }
160
161 ErrorCode SharedSetData::set_sharing_procs( EntityHandle entity_set, std::vector< unsigned >& ranks )
162 {
163 std::sort( ranks.begin(), ranks.end() );
164 RProcMap::iterator it = procListMap.insert( ranks ).first;
165
166 ErrorCode rval;
167 SharedSetTagData data;
168 rval = mb.tag_get_data( sharedSetTag, &entity_set, 1, &data );
169 if( MB_SUCCESS != rval ) return rval;
170
171 data.sharingProcs = &*it;
172 rval = mb.tag_set_data( sharedSetTag, &entity_set, 1, &data );
173 if( MB_SUCCESS != rval ) return rval;
174
175 return MB_SUCCESS;
176 }
177
178 void SharedSetData::append_local_handles( const ProcHandleMapType& map, Range& range )
179 {
180 Range::iterator hint = range.begin();
181 for( ProcHandleMapType::const_iterator i = map.begin(); i != map.end(); ++i )
182 hint = range.insert( hint, i->value, i->value + i->count - 1 );
183 }
184
185 }