1 /* -*- Mode: C; c-basic-offset:4 ; -*- */
2 /*
3 *
4 * (C) 2001 by Argonne National Laboratory.
5 * See COPYRIGHT in top-level directory.
6 */
7
8 #include "mpiimpl.h"
9 #include "rma.h"
10
11 /* -- Begin Profiling Symbol Block for routine MPIX_Win_unlock_all */
12 #if defined(HAVE_PRAGMA_WEAK)
13 #pragma weak MPIX_Win_unlock_all = PMPIX_Win_unlock_all
14 #elif defined(HAVE_PRAGMA_HP_SEC_DEF)
15 #pragma _HP_SECONDARY_DEF PMPIX_Win_unlock_all MPIX_Win_unlock_all
16 #elif defined(HAVE_PRAGMA_CRI_DUP)
17 #pragma _CRI duplicate MPIX_Win_unlock_all as PMPIX_Win_unlock_all
18 #endif
19 /* -- End Profiling Symbol Block */
20
21 /* Define MPICH_MPI_FROM_PMPI if weak symbols are not supported to build
22 the MPI routines */
23 #ifndef MPICH_MPI_FROM_PMPI
24 #undef MPIX_Win_unlock_all
25 #define MPIX_Win_unlock_all PMPIX_Win_unlock_all
26
27 #endif
28
29 #undef FUNCNAME
30 #define FUNCNAME MPIX_Win_unlock_all
31
32 /*@
33 MPIX_Win_unlock_all - Completes an RMA access epoch all processes on the
34 given window
35
36 Input Parameters:
37 . win - window object (handle)
38
39 .N ThreadSafe
40
41 .N Fortran
42
43 .N Errors
44 .N MPI_SUCCESS
45 .N MPI_ERR_RANK
46 .N MPI_ERR_WIN
47 .N MPI_ERR_OTHER
48
49 .seealso: MPIX_Win_lock_all
50 @*/
MPIX_Win_unlock_all(MPI_Win win)51 int MPIX_Win_unlock_all(MPI_Win win)
52 {
53 static const char FCNAME[] = "MPIX_Win_unlock_all";
54 int mpi_errno = MPI_SUCCESS;
55 MPID_Win *win_ptr = NULL;
56 MPID_MPI_STATE_DECL(MPID_STATE_MPIX_WIN_UNLOCK_ALL);
57
58 MPIR_ERRTEST_INITIALIZED_ORDIE();
59
60 MPIU_THREAD_CS_ENTER(ALLFUNC,);
61 MPID_MPI_FUNC_ENTER(MPID_STATE_MPIX_WIN_UNLOCK_ALL);
62
63 /* Validate parameters, especially handles needing to be converted */
64 # ifdef HAVE_ERROR_CHECKING
65 {
66 MPID_BEGIN_ERROR_CHECKS;
67 {
68 MPIR_ERRTEST_WIN(win, mpi_errno);
69 }
70 MPID_END_ERROR_CHECKS;
71 }
72 # endif
73
74 /* Convert MPI object handles to object pointers */
75 MPID_Win_get_ptr( win, win_ptr );
76
77 /* Validate parameters and objects (post conversion) */
78 # ifdef HAVE_ERROR_CHECKING
79 {
80 MPID_BEGIN_ERROR_CHECKS;
81 {
82 /* Validate win_ptr */
83 MPID_Win_valid_ptr( win_ptr, mpi_errno );
84 /* If win_ptr is not valid, it will be reset to null */
85 if (mpi_errno) goto fn_fail;
86
87 /* Test that the rank we are unlocking is the rank that we locked */
88 if (win_ptr->lockRank != MPID_WIN_STATE_LOCKED_ALL) {
89 if (win_ptr->lockRank == MPID_WIN_STATE_UNLOCKED) {
90 MPIU_ERR_SET(mpi_errno,MPI_ERR_RANK,"**winunlockwithoutlock");
91 }
92 else {
93 MPIU_ERR_SET2(mpi_errno,MPI_ERR_RANK,
94 "**mismatchedlockrank",
95 "**mismatchedlockrank %d %d", MPID_WIN_STATE_LOCKED_ALL, win_ptr->lockRank );
96 }
97 if (mpi_errno) goto fn_fail;
98 }
99 }
100 MPID_END_ERROR_CHECKS;
101 }
102 # endif /* HAVE_ERROR_CHECKING */
103
104 /* ... body of routine ... */
105
106 mpi_errno = MPIU_RMA_CALL(win_ptr,Win_unlock_all(win_ptr));
107 if (mpi_errno != MPI_SUCCESS) goto fn_fail;
108 /* Clear the lockRank on success with the unlock */
109 /* FIXME: Should this always be cleared, even on failure? */
110 win_ptr->lockRank = MPID_WIN_STATE_UNLOCKED;
111
112 /* ... end of body of routine ... */
113
114 fn_exit:
115 MPID_MPI_FUNC_EXIT(MPID_STATE_MPIX_WIN_UNLOCK_ALL);
116 MPIU_THREAD_CS_EXIT(ALLFUNC,);
117 return mpi_errno;
118
119 fn_fail:
120 /* --BEGIN ERROR HANDLING-- */
121 # ifdef HAVE_ERROR_CHECKING
122 {
123 mpi_errno = MPIR_Err_create_code(
124 mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**mpix_win_unlock_all",
125 "**mpix_win_unlock_all %W", win);
126 }
127 # endif
128 mpi_errno = MPIR_Err_return_win( win_ptr, FCNAME, mpi_errno );
129 goto fn_exit;
130 /* --END ERROR HANDLING-- */
131 }
132
133