1 // -*- c++ -*-
2 //
3 // Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
4 //                         University Research and Technology
5 //                         Corporation.  All rights reserved.
6 // Copyright (c) 2004-2005 The University of Tennessee and The University
7 //                         of Tennessee Research Foundation.  All rights
8 //                         reserved.
9 // Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
10 //                         University of Stuttgart.  All rights reserved.
11 // Copyright (c) 2004-2005 The Regents of the University of California.
12 //                         All rights reserved.
13 // Copyright (c) 2007      Sun Microsystems, Inc.  All rights reserved.
14 // Copyright (c) 2007-2008 Cisco Systems, Inc.  All rights reserved.
15 // $COPYRIGHT$
16 //
17 // Additional copyrights may follow
18 //
19 // $HEADER$
20 //
21 
22 
23 
24 //
25 // Miscellany
26 //
27 
28 
29 inline MPI::Errhandler
Get_errhandler()30 MPI::Win:: Get_errhandler() const
31 {
32     MPI_Errhandler errhandler;
33     MPI_Win_get_errhandler(mpi_win, &errhandler);
34     return errhandler;
35 }
36 
37 
38 inline void
Set_errhandler(const MPI::Errhandler & errhandler)39 MPI::Win::Set_errhandler(const MPI::Errhandler& errhandler) const
40 {
41     (void)MPI_Win_set_errhandler(mpi_win, errhandler);
42 }
43 
44 
45 //
46 // One sided communication
47 //
48 
49 
50 inline void
Accumulate(const void * origin_addr,int origin_count,const MPI::Datatype & origin_datatype,int target_rank,MPI::Aint target_disp,int target_count,const MPI::Datatype & target_datatype,const MPI::Op & op)51 MPI::Win::Accumulate(const void* origin_addr, int origin_count,
52 	       	const MPI::Datatype& origin_datatype, int target_rank,
53 	       	MPI::Aint target_disp, int target_count,
54 	       	const MPI::Datatype& target_datatype,
55 	       	const MPI::Op& op) const
56 {
57   (void) MPI_Accumulate(const_cast<void *>(origin_addr), origin_count, origin_datatype,
58 			target_rank, target_disp, target_count,
59 			target_datatype, op, mpi_win);
60 
61 }
62 
63 
64 inline void
Complete()65 MPI::Win::Complete() const
66 {
67   (void) MPI_Win_complete(mpi_win);
68 }
69 
70 
71 inline  MPI::Win
Create(const void * base,MPI::Aint size,int disp_unit,const MPI::Info & info,const MPI::Intracomm & comm)72 MPI::Win::Create(const void* base, MPI::Aint size,
73 			int disp_unit, const MPI::Info& info,
74 			const MPI::Intracomm& comm)
75 {
76   MPI_Win newwin;
77   (void) MPI_Win_create(const_cast<void *>(base), size, disp_unit, info, comm, &newwin);
78   return newwin;
79 }
80 
81 
82 inline void
Fence(int assert)83 MPI::Win::Fence(int assert) const
84 {
85   (void) MPI_Win_fence(assert, mpi_win);
86 }
87 
88 
89 inline void
Get(const void * origin_addr,int origin_count,const MPI::Datatype & origin_datatype,int target_rank,MPI::Aint target_disp,int target_count,const MPI::Datatype & target_datatype)90 MPI::Win::Get(const void *origin_addr, int origin_count,
91 		     const MPI::Datatype& origin_datatype,
92 		     int target_rank, MPI::Aint target_disp,
93 		     int target_count,
94 		     const MPI::Datatype& target_datatype) const
95 {
96   (void) MPI_Get(const_cast<void *>(origin_addr), origin_count, origin_datatype,
97 		     target_rank, target_disp,
98 		     target_count, target_datatype, mpi_win);
99 
100 }
101 
102 
103 inline MPI::Group
Get_group()104 MPI::Win::Get_group() const
105 {
106   MPI_Group mpi_group;
107   (void) MPI_Win_get_group(mpi_win, &mpi_group);
108   return mpi_group;
109 }
110 
111 
112 inline void
Lock(int lock_type,int rank,int assert)113 MPI::Win::Lock(int lock_type, int rank, int assert) const
114 {
115   (void) MPI_Win_lock(lock_type, rank, assert, mpi_win);
116 }
117 
118 
119 inline void
Post(const MPI::Group & group,int assert)120 MPI::Win::Post(const MPI::Group& group, int assert) const
121 {
122   (void) MPI_Win_post(group, assert, mpi_win);
123 }
124 
125 
126 inline void
Put(const void * origin_addr,int origin_count,const MPI::Datatype & origin_datatype,int target_rank,MPI::Aint target_disp,int target_count,const MPI::Datatype & target_datatype)127 MPI::Win::Put(const void* origin_addr, int origin_count,
128 		     const MPI::Datatype& origin_datatype,
129 		     int target_rank, MPI::Aint target_disp,
130 		     int target_count,
131 		     const MPI::Datatype& target_datatype) const
132 {
133   (void) MPI_Put(const_cast<void *>(origin_addr), origin_count, origin_datatype,
134 		 target_rank, target_disp, target_count,
135 		 target_datatype, mpi_win);
136 
137 }
138 
139 
140 inline void
Start(const MPI::Group & group,int assert)141 MPI::Win::Start(const MPI::Group& group, int assert) const
142 {
143   (void) MPI_Win_start(group, assert, mpi_win);
144 }
145 
146 
147 inline bool
Test()148 MPI::Win::Test() const
149 {
150   int flag;
151   MPI_Win_test(mpi_win, &flag);
152   return OPAL_INT_TO_BOOL(flag);
153 
154 }
155 
156 
157 inline void
Unlock(int rank)158 MPI::Win::Unlock(int rank) const
159 {
160   (void) MPI_Win_unlock(rank, mpi_win);
161 }
162 
163 
164 inline void
Wait()165 MPI::Win::Wait() const
166 {
167   (void) MPI_Win_wait(mpi_win);
168 }
169 
170 
171 //
172 // External Interfaces
173 //
174 
175 inline void
Call_errhandler(int errorcode)176 MPI::Win::Call_errhandler(int errorcode) const
177 {
178   (void) MPI_Win_call_errhandler(mpi_win, errorcode);
179 }
180 
181 // 1) original Create_keyval that takes the first 2 arguments as C++
182 //    functions
183 inline int
Create_keyval(MPI::Win::Copy_attr_function * win_copy_attr_fn,MPI::Win::Delete_attr_function * win_delete_attr_fn,void * extra_state)184 MPI::Win::Create_keyval(MPI::Win::Copy_attr_function* win_copy_attr_fn,
185                              MPI::Win::Delete_attr_function* win_delete_attr_fn,
186                              void* extra_state)
187 {
188     // Back-end function does the heavy lifting
189     int ret, keyval;
190     ret = do_create_keyval(NULL, NULL,
191                            win_copy_attr_fn, win_delete_attr_fn,
192                            extra_state, keyval);
193     return (MPI_SUCCESS == ret) ? keyval : ret;
194 }
195 
196 // 2) overload Create_keyval to take the first 2 arguments as C
197 //    functions
198 inline int
Create_keyval(MPI_Win_copy_attr_function * win_copy_attr_fn,MPI_Win_delete_attr_function * win_delete_attr_fn,void * extra_state)199 MPI::Win::Create_keyval(MPI_Win_copy_attr_function* win_copy_attr_fn,
200                              MPI_Win_delete_attr_function* win_delete_attr_fn,
201                              void* extra_state)
202 {
203     // Back-end function does the heavy lifting
204     int ret, keyval;
205     ret = do_create_keyval(win_copy_attr_fn, win_delete_attr_fn,
206                            NULL, NULL,
207                            extra_state, keyval);
208     return (MPI_SUCCESS == ret) ? keyval : ret;
209 }
210 
211 // 3) overload Create_keyval to take the first 2 arguments as C++ & C
212 //    functions
213 inline int
Create_keyval(MPI::Win::Copy_attr_function * win_copy_attr_fn,MPI_Win_delete_attr_function * win_delete_attr_fn,void * extra_state)214 MPI::Win::Create_keyval(MPI::Win::Copy_attr_function* win_copy_attr_fn,
215                              MPI_Win_delete_attr_function* win_delete_attr_fn,
216                              void* extra_state)
217 {
218     // Back-end function does the heavy lifting
219     int ret, keyval;
220     ret = do_create_keyval(NULL, win_delete_attr_fn,
221                            win_copy_attr_fn, NULL,
222                            extra_state, keyval);
223     return (MPI_SUCCESS == ret) ? keyval : ret;
224 }
225 
226 // 4) overload Create_keyval to take the first 2 arguments as C & C++
227 //    functions
228 inline int
Create_keyval(MPI_Win_copy_attr_function * win_copy_attr_fn,MPI::Win::Delete_attr_function * win_delete_attr_fn,void * extra_state)229 MPI::Win::Create_keyval(MPI_Win_copy_attr_function* win_copy_attr_fn,
230                              MPI::Win::Delete_attr_function* win_delete_attr_fn,
231                              void* extra_state)
232 {
233     // Back-end function does the heavy lifting
234     int ret, keyval;
235     ret = do_create_keyval(win_copy_attr_fn, NULL,
236                            NULL, win_delete_attr_fn,
237                            extra_state, keyval);
238     return (MPI_SUCCESS == ret) ? keyval : ret;
239 }
240 
241 inline void
Delete_attr(int win_keyval)242 MPI::Win::Delete_attr(int win_keyval)
243 {
244   (void) MPI_Win_delete_attr(mpi_win, win_keyval);
245 }
246 
247 
248 inline void
Free_keyval(int & win_keyval)249 MPI::Win::Free_keyval(int& win_keyval)
250 {
251   (void) MPI_Win_free_keyval(&win_keyval);
252 }
253 
254 
255 // version 1: pre-errata Get_attr (not correct, but probably nice to support
256 inline bool
Get_attr(const Win & win,int win_keyval,void * attribute_val)257 MPI::Win::Get_attr(const Win& win, int win_keyval,
258                          void* attribute_val) const
259 {
260   int ret;
261   (void) MPI_Win_get_attr(win, win_keyval, attribute_val, &ret);
262   return OPAL_INT_TO_BOOL(ret);
263 }
264 
265 
266 // version 2: post-errata Get_attr (correct, but no one seems to know about it)
267 inline bool
Get_attr(int win_keyval,void * attribute_val)268 MPI::Win::Get_attr(int win_keyval, void* attribute_val) const
269 {
270   int ret;
271   (void) MPI_Win_get_attr(mpi_win, win_keyval, attribute_val, &ret);
272   return OPAL_INT_TO_BOOL(ret);
273 }
274 
275 
276 inline void
Get_name(char * win_name,int & resultlen)277 MPI::Win::Get_name(char* win_name, int& resultlen) const
278 {
279   (void) MPI_Win_get_name(mpi_win, win_name, &resultlen);
280 }
281 
282 
283 inline void
Set_attr(int win_keyval,const void * attribute_val)284 MPI::Win::Set_attr(int win_keyval, const void* attribute_val)
285 {
286   (void) MPI_Win_set_attr(mpi_win, win_keyval, const_cast<void *>(attribute_val));
287 }
288 
289 
290 inline void
Set_name(const char * win_name)291 MPI::Win::Set_name(const char* win_name)
292 {
293   (void) MPI_Win_set_name(mpi_win, const_cast<char *>(win_name));
294 }
295 
296