2004-03-17 02:34:41 +03:00
|
|
|
/*
|
2005-11-05 22:57:48 +03:00
|
|
|
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
|
|
|
* University Research and Technology
|
|
|
|
* Corporation. All rights reserved.
|
|
|
|
* Copyright (c) 2004-2005 The University of Tennessee and The University
|
|
|
|
* of Tennessee Research Foundation. All rights
|
|
|
|
* reserved.
|
2004-11-28 23:09:25 +03:00
|
|
|
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
|
|
|
* University of Stuttgart. All rights reserved.
|
2005-03-24 15:43:37 +03:00
|
|
|
* Copyright (c) 2004-2005 The Regents of the University of California.
|
|
|
|
* All rights reserved.
|
2004-11-22 04:38:40 +03:00
|
|
|
* $COPYRIGHT$
|
|
|
|
*
|
|
|
|
* Additional copyrights may follow
|
|
|
|
*
|
2004-03-17 02:34:41 +03:00
|
|
|
* $HEADER$
|
|
|
|
*/
|
|
|
|
|
2004-06-07 19:33:53 +04:00
|
|
|
#ifndef OMPI_WIN_H
|
|
|
|
#define OMPI_WIN_H
|
2004-03-17 02:34:41 +03:00
|
|
|
|
2006-01-28 18:38:37 +03:00
|
|
|
#include "ompi_config.h"
|
2004-03-26 08:32:37 +03:00
|
|
|
#include "mpi.h"
|
2006-01-28 18:38:37 +03:00
|
|
|
|
2005-07-03 20:06:07 +04:00
|
|
|
#include "opal/class/opal_object.h"
|
2006-01-28 18:38:37 +03:00
|
|
|
#include "opal/class/opal_hash_table.h"
|
|
|
|
#include "ompi/errhandler/errhandler.h"
|
|
|
|
#include "ompi/info/info.h"
|
|
|
|
#include "ompi/communicator/communicator.h"
|
|
|
|
#include "ompi/group/group.h"
|
|
|
|
#include "ompi/mca/osc/osc.h"
|
|
|
|
|
2004-10-21 02:31:03 +04:00
|
|
|
#if defined(c_plusplus) || defined(__cplusplus)
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
2004-03-17 02:34:41 +03:00
|
|
|
|
2006-01-31 05:44:08 +03:00
|
|
|
/* flags */
|
2006-01-28 18:38:37 +03:00
|
|
|
#define OMPI_WIN_FREED 0x00000001
|
|
|
|
#define OMPI_WIN_INVALID 0x00000002
|
|
|
|
#define OMPI_WIN_NO_LOCKS 0x00000004
|
2006-01-31 05:44:08 +03:00
|
|
|
|
|
|
|
/* mode */
|
|
|
|
#define OMPI_WIN_ACCESS_EPOCH 0x00000001
|
|
|
|
#define OMPI_WIN_EXPOSE_EPOCH 0x00000002
|
|
|
|
#define OMPI_WIN_POSTED 0x00000010
|
|
|
|
#define OMPI_WIN_STARTED 0x00000020
|
|
|
|
#define OMPI_WIN_LOCK_ACCESS 0x00000040
|
2004-03-17 02:34:41 +03:00
|
|
|
|
2006-02-01 00:40:12 +03:00
|
|
|
OMPI_DECLSPEC extern ompi_pointer_array_t ompi_mpi_windows;
|
|
|
|
|
2004-06-07 19:33:53 +04:00
|
|
|
struct ompi_win_t {
|
2006-01-28 18:38:37 +03:00
|
|
|
opal_object_t w_base;
|
2004-03-19 03:00:09 +03:00
|
|
|
|
2006-01-28 18:38:37 +03:00
|
|
|
opal_mutex_t w_lock;
|
2004-03-17 02:34:41 +03:00
|
|
|
|
2006-01-28 18:38:37 +03:00
|
|
|
char w_name[MPI_MAX_OBJECT_NAME];
|
2004-03-19 03:00:09 +03:00
|
|
|
|
2006-02-01 00:40:12 +03:00
|
|
|
/* Group associated with this window. */
|
2006-01-28 18:38:37 +03:00
|
|
|
ompi_group_t *w_group;
|
2004-03-17 02:34:41 +03:00
|
|
|
|
2006-02-01 00:40:12 +03:00
|
|
|
/* Information about the state of the window. */
|
|
|
|
uint16_t w_flags;
|
|
|
|
|
2006-01-28 18:38:37 +03:00
|
|
|
/* Attributes */
|
|
|
|
opal_hash_table_t *w_keyhash;
|
2004-03-19 03:00:09 +03:00
|
|
|
|
2006-01-28 18:38:37 +03:00
|
|
|
/* index in Fortran <-> C translation array */
|
|
|
|
int w_f_to_c_index;
|
2004-03-19 03:00:09 +03:00
|
|
|
|
2006-02-01 00:40:12 +03:00
|
|
|
/* Error handling. This field does not have the "w_" prefix so
|
|
|
|
that the OMPI_ERRHDL_* macros can find it, regardless of
|
|
|
|
whether it's a comm, window, or file. */
|
2004-09-06 16:06:27 +04:00
|
|
|
ompi_errhandler_t *error_handler;
|
|
|
|
ompi_errhandler_type_t errhandler_type;
|
2006-01-28 18:38:37 +03:00
|
|
|
|
|
|
|
/* displacement factor */
|
|
|
|
int w_disp_unit;
|
|
|
|
|
|
|
|
void *w_baseptr;
|
|
|
|
long w_size;
|
|
|
|
|
2006-02-01 00:40:12 +03:00
|
|
|
/** Current epoch / mode (access, expose, lock, etc.). Checked by
|
|
|
|
the argument checking code in the MPI layer, set by the OSC
|
|
|
|
component. Modified without locking w_lock. */
|
|
|
|
volatile uint16_t w_mode;
|
|
|
|
|
2006-01-28 18:38:37 +03:00
|
|
|
/* one sided interface */
|
|
|
|
ompi_osc_base_module_t *w_osc_module;
|
2004-03-17 02:34:41 +03:00
|
|
|
};
|
2004-06-07 19:33:53 +04:00
|
|
|
typedef struct ompi_win_t ompi_win_t;
|
2004-10-22 20:06:05 +04:00
|
|
|
OMPI_DECLSPEC OBJ_CLASS_DECLARATION(ompi_win_t);
|
2006-01-28 18:38:37 +03:00
|
|
|
|
2006-02-01 00:40:12 +03:00
|
|
|
OMPI_DECLSPEC extern ompi_win_t ompi_mpi_win_null;
|
2006-01-28 18:38:37 +03:00
|
|
|
|
2006-02-01 00:40:12 +03:00
|
|
|
int ompi_win_init(void);
|
|
|
|
int ompi_win_finalize(void);
|
2006-01-28 18:38:37 +03:00
|
|
|
|
2006-02-01 00:40:12 +03:00
|
|
|
int ompi_win_create(void *base, long size, int disp_unit,
|
|
|
|
ompi_communicator_t *comm, ompi_info_t *info,
|
|
|
|
ompi_win_t **newwin);
|
2006-01-28 18:38:37 +03:00
|
|
|
|
2006-02-01 00:40:12 +03:00
|
|
|
int ompi_win_free(ompi_win_t *win);
|
2006-01-28 18:38:37 +03:00
|
|
|
|
2006-02-01 00:40:12 +03:00
|
|
|
int ompi_win_set_name(ompi_win_t *win, char *win_name);
|
|
|
|
int ompi_win_get_name(ompi_win_t *win, char *win_name, int *length);
|
2006-01-28 18:38:37 +03:00
|
|
|
|
2006-02-01 00:40:12 +03:00
|
|
|
int ompi_win_group(ompi_win_t *win, ompi_group_t **group);
|
2006-01-28 18:38:37 +03:00
|
|
|
|
2006-02-01 00:40:12 +03:00
|
|
|
static inline int ompi_win_invalid(ompi_win_t *win) {
|
|
|
|
if (NULL == win ||
|
|
|
|
MPI_WIN_NULL == win ||
|
|
|
|
(OMPI_WIN_INVALID & win->w_flags) ||
|
|
|
|
(OMPI_WIN_FREED & win->w_flags)) {
|
|
|
|
return true;
|
|
|
|
} else {
|
2006-01-28 18:38:37 +03:00
|
|
|
return false;
|
|
|
|
}
|
2006-02-01 00:40:12 +03:00
|
|
|
}
|
2006-01-28 18:38:37 +03:00
|
|
|
|
2006-02-01 00:40:12 +03:00
|
|
|
static inline int ompi_win_peer_invalid(ompi_win_t *win, int peer) {
|
|
|
|
if (win->w_group->grp_proc_count <= peer) return true;
|
|
|
|
return false;
|
|
|
|
}
|
2004-10-20 16:28:09 +04:00
|
|
|
|
2006-02-01 00:40:12 +03:00
|
|
|
static inline int ompi_win_rank(ompi_win_t *win) {
|
|
|
|
return win->w_group->grp_my_rank;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline bool ompi_win_allow_locks(ompi_win_t *win) {
|
|
|
|
return (0 != (win->w_flags & OMPI_WIN_NO_LOCKS));
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int16_t ompi_win_get_mode(ompi_win_t *win) {
|
|
|
|
int16_t mode = win->w_mode;
|
|
|
|
opal_atomic_rmb();
|
|
|
|
return mode;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void ompi_win_set_mode(ompi_win_t *win, int16_t mode) {
|
|
|
|
win->w_mode = mode;
|
|
|
|
opal_atomic_wmb();
|
|
|
|
}
|
2006-01-31 05:44:08 +03:00
|
|
|
|
2004-10-21 02:31:03 +04:00
|
|
|
#if defined(c_plusplus) || defined(__cplusplus)
|
|
|
|
}
|
|
|
|
#endif
|
2004-03-17 02:34:41 +03:00
|
|
|
#endif
|