/******************************************************************************
Shared Memory Implementation
******************************************************************************/
MPID_shm_Win_create(base, size, disp_unit, info, comm, dwin)
{
if (!arch.cc_shm)
{
dwin->no_prev_put = 0;
}
process_mutex_init(win.process_mutex);
}
/* MPID_shm_Win_create() */
MPID_shm_Win_free(dwin)
{
process_mutex_destroy(dwin->process_mutex);
}
/* MPID_shm_Win_free() */
MPID_shm_Win_fence(assert, win)
{
if (!arch.cc_shm && !(assert & MPI_MODE_NOSTORE))
{
/* flush cache and/or write buffer */
}
rc = MPI_Barrier(dwin->comm);
if (!arch.cc_shm)
{
if (!dwin->no_prev_put)
{
/* invlidate cache */
}
dwin->no_prev_put = assert & (MPI_MODE_NOPUT | MPI_MODE_NOSUCCEED);
}
rc = MPI_SUCCESS;
}
/* MPID_shm_Win_fence() */
MPID_shm_Get(origin_addr, origin_count, origin_datatype,
target_rank, target_disp, target_count, target_datatype, win)
{
target_addr = MPIR_Win_compute_addr(dwin, target_rank, target_disp);
rc = MPIR_Copy_data(target_addr, target_count, target_datatype,
origin_adrr, origin_count, origin_datatype);
}
/* MPID_shm_get() */
MPID_shm_Put(origin_addr, origin_count, origin_datatype,
target_rank, target_disp, target_count, target_datatype, win)
{
target_addr = MPIR_Win_compute_addr(dwin, target_rank, target_disp);
rc = MPIR_Copy_data(origin_adrr, origin_count, origin_datatype,
target_addr, target_count, target_datatype);
}
/* MPID_shm_Put() */
MPID_shm_Accumulate(origin_addr, origin_count, origin_datatype,
target_rank, target_disp, target_count, target_datatype,
op, win)
{
target_addr = MPIR_Win_compute_addr(dwin, target_rank, target_disp);
process_mutex_lock(win.process_mutex);
{
/* perform requested operations */
}
process_mutex_unlock(win.process_mutex);
}
/* MPID_shm_Accumulate() */