/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2001 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*
*/
#ifndef MPIR_WIN_H_INCLUDED
#define MPIR_WIN_H_INCLUDED
/*S
MPIR_Win - Description of the Window Object data structure.
Module:
Win-DS
Notes:
The following 3 keyvals are defined for attributes on all MPI
Window objects\:
.vb
MPI_WIN_SIZE
MPI_WIN_BASE
MPI_WIN_DISP_UNIT
.ve
These correspond to the values in 'length', 'start_address', and
'disp_unit'.
The communicator in the window is the same communicator that the user
provided to 'MPI_Win_create' (not a dup). However, each intracommunicator
has a special context id that may be used if MPI communication is used
by the implementation to implement the RMA operations.
There is no separate window group; the group of the communicator should be
used.
Question:
Should a 'MPID_Win' be defined after 'MPIR_Segment' in case the device
wants to
store a queue of pending put/get operations, described with 'MPIR_Segment'
(or 'MPIR_Request')s?
S*/
struct MPIR_Win {
MPIR_OBJECT_HEADER; /* adds handle and ref_count fields */
MPID_Thread_mutex_t mutex;
MPIR_Errhandler *errhandler; /* Pointer to the error handler structure */
void *base;
MPI_Aint size;
int disp_unit; /* Displacement unit of *local* window */
MPIR_Attribute *attributes;
MPIR_Comm *comm_ptr; /* Pointer to comm of window (dup) */
#ifdef USE_THREADED_WINDOW_CODE
/* These were causing compilation errors. We need to figure out how to
* integrate threads into MPICH before including these fields. */
/* FIXME: The test here should be within a test for threaded support */
#ifdef HAVE_PTHREAD_H
pthread_t wait_thread_id; /* id of thread handling MPI_Win_wait */
pthread_t passive_target_thread_id; /* thread for passive target RMA */
#elif defined(HAVE_WINTHREADS)
HANDLE wait_thread_id;
HANDLE passive_target_thread_id;
#endif
#endif
/* These are COPIES of the values so that addresses to them
* can be returned as attributes. They are initialized by the
* MPI_Win_get_attr function.
*
* These values are constant for the lifetime of the window, so
* this is thread-safe.
*/
int copyDispUnit;
MPI_Aint copySize;
char name[MPI_MAX_OBJECT_NAME];
MPIR_Win_flavor_t create_flavor;
MPIR_Win_model_t model;
MPIR_Win_flavor_t copyCreateFlavor;
MPIR_Win_model_t copyModel;
/* Other, device-specific information */
#ifdef MPID_DEV_WIN_DECL
MPID_DEV_WIN_DECL
#endif
};
extern MPIR_Object_alloc_t MPIR_Win_mem;
/* Preallocated win objects */
extern MPIR_Win MPIR_Win_direct[];
int MPIR_Type_is_rma_atomic(MPI_Datatype type);
int MPIR_Compare_equal(const void *a, const void *b, MPI_Datatype type);
#endif /* MPIR_WIN_H_INCLUDED */