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