1 /* -*- Mode: C; c-basic-offset:4 ; -*- */
2 /*
3 * (C) 2001 by Argonne National Laboratory.
4 * See COPYRIGHT in top-level directory.
5 */
6
7 #include "mpidi_ch3_impl.h"
8 #include "mpidrma.h"
9
10
11 #undef FUNCNAME
12 #define FUNCNAME MPIDI_CH3_Win_shared_query
13 #undef FCNAME
14 #define FCNAME MPIDI_QUOTE(FUNCNAME)
MPIDI_CH3_SHM_Win_shared_query(MPID_Win * win_ptr,int target_rank,MPI_Aint * size,int * disp_unit,void * baseptr)15 int MPIDI_CH3_SHM_Win_shared_query(MPID_Win *win_ptr, int target_rank, MPI_Aint *size, int *disp_unit, void *baseptr)
16 {
17 int comm_size;
18 int mpi_errno = MPI_SUCCESS;
19 MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3_WIN_SHARED_QUERY);
20
21 MPIDI_RMA_FUNC_ENTER(MPID_STATE_MPIDI_CH3_WIN_SHARED_QUERY);
22
23 comm_size = win_ptr->comm_ptr->local_size;
24
25 if (win_ptr->create_flavor != MPIX_WIN_FLAVOR_SHARED) {
26 MPIU_ERR_SETANDJUMP(mpi_errno, MPIX_ERR_RMA_WRONG_FLAVOR, "**winflavor");
27 }
28
29 /* Scan the sizes to locate the first process that allocated a nonzero
30 * amount of space */
31 if (target_rank == MPI_PROC_NULL) {
32 int i;
33
34 /* Default, if no processes have size > 0. */
35 *size = 0;
36 *((void**) baseptr) = NULL;
37
38 for (i = 0; i < comm_size; i++) {
39 if (win_ptr->sizes[i] > 0) {
40 *size = win_ptr->sizes[i];
41 *((void**) baseptr) = win_ptr->shm_base_addrs[i];
42 break;
43 }
44 }
45
46 } else {
47 *size = win_ptr->sizes[target_rank];
48 *((void**) baseptr) = win_ptr->shm_base_addrs[target_rank];
49 }
50
51 fn_exit:
52 MPIDI_RMA_FUNC_EXIT(MPID_STATE_MPIDI_CH3_WIN_SHARED_QUERY);
53 return mpi_errno;
54
55 fn_fail:
56 goto fn_exit;
57 }
58
59
60 #undef FUNCNAME
61 #define FUNCNAME MPIDI_CH3_SHM_Win_free
62 #undef FCNAME
63 #define FCNAME MPIDI_QUOTE(FUNCNAME)
MPIDI_CH3_SHM_Win_free(MPID_Win ** win_ptr)64 int MPIDI_CH3_SHM_Win_free(MPID_Win **win_ptr)
65 {
66 int mpi_errno = MPI_SUCCESS;
67 MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3_SHM_WIN_FREE);
68
69 MPIDI_RMA_FUNC_ENTER(MPID_STATE_MPIDI_CH3_SHM_WIN_FREE);
70
71 /* Free shared memory region */
72 if ((*win_ptr)->shm_allocated) {
73 /* free shm_base_addrs that's only used for shared memory windows */
74 MPIU_Free((*win_ptr)->shm_base_addrs);
75 /* detach from shared memory segment */
76 mpi_errno = MPIU_SHMW_Seg_detach((*win_ptr)->shm_segment_handle, (char **)&(*win_ptr)->shm_base_addr,
77 (*win_ptr)->shm_segment_len);
78 if (mpi_errno) MPIU_ERR_POP(mpi_errno);
79
80 MPIU_SHMW_Hnd_finalize(&(*win_ptr)->shm_segment_handle);
81 }
82
83 mpi_errno = MPIDI_Win_free(win_ptr);
84 if (mpi_errno != MPI_SUCCESS) { MPIU_ERR_POP(mpi_errno); }
85
86 fn_exit:
87 MPIDI_RMA_FUNC_EXIT(MPID_STATE_MPIDI_CH3_SHM_WIN_FREE);
88 return mpi_errno;
89
90 fn_fail:
91 goto fn_exit;
92 }
93