root/ompi/mca/osc/rdma/osc_rdma_sync.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ompi_osc_rdma_sync_constructor
  2. ompi_osc_rdma_sync_destructor
  3. ompi_osc_rdma_sync_allocate
  4. ompi_osc_rdma_sync_return
  5. ompi_osc_rdma_sync_array_peer
  6. ompi_osc_rdma_sync_pscw_peer

   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
   2 /*
   3  * Copyright (c) 2015-2018 Los Alamos National Security, LLC.  All rights
   4  *                         reserved.
   5  * $COPYRIGHT$
   6  *
   7  * Additional copyrights may follow
   8  *
   9  * $HEADER$
  10  */
  11 
  12 #include "osc_rdma.h"
  13 #include "osc_rdma_sync.h"
  14 
  15 static void ompi_osc_rdma_sync_constructor (ompi_osc_rdma_sync_t *rdma_sync)
  16 {
  17     rdma_sync->type = OMPI_OSC_RDMA_SYNC_TYPE_NONE;
  18     rdma_sync->epoch_active = false;
  19     rdma_sync->outstanding_rdma.counter = 0;
  20     OBJ_CONSTRUCT(&rdma_sync->lock, opal_mutex_t);
  21     OBJ_CONSTRUCT(&rdma_sync->demand_locked_peers, opal_list_t);
  22 }
  23 
  24 static void ompi_osc_rdma_sync_destructor (ompi_osc_rdma_sync_t *rdma_sync)
  25 {
  26     OBJ_DESTRUCT(&rdma_sync->lock);
  27     OBJ_DESTRUCT(&rdma_sync->demand_locked_peers);
  28 }
  29 
  30 OBJ_CLASS_INSTANCE(ompi_osc_rdma_sync_t, opal_object_t, ompi_osc_rdma_sync_constructor,
  31                    ompi_osc_rdma_sync_destructor);
  32 
  33 ompi_osc_rdma_sync_t *ompi_osc_rdma_sync_allocate (struct ompi_osc_rdma_module_t *module)
  34 {
  35     ompi_osc_rdma_sync_t *rdma_sync;
  36 
  37     rdma_sync = OBJ_NEW (ompi_osc_rdma_sync_t);
  38     if (OPAL_UNLIKELY(NULL == rdma_sync)) {
  39         return NULL;
  40     }
  41 
  42     rdma_sync->module = module;
  43     return rdma_sync;
  44 }
  45 
  46 void ompi_osc_rdma_sync_return (ompi_osc_rdma_sync_t *rdma_sync)
  47 {
  48     OBJ_RELEASE(rdma_sync);
  49 }
  50 
  51 static inline bool ompi_osc_rdma_sync_array_peer (int rank, ompi_osc_rdma_peer_t **peers, size_t nranks,
  52                                                   struct ompi_osc_rdma_peer_t **peer)
  53 {
  54     int mid = nranks / 2;
  55 
  56     /* base cases */
  57     if (0 == nranks || (1 == nranks && peers[0]->rank != rank)) {
  58         *peer = NULL;
  59         return false;
  60     } else if (peers[0]->rank == rank) {
  61         *peer = peers[0];
  62         return true;
  63     }
  64 
  65     if (peers[mid]->rank > rank) {
  66         return ompi_osc_rdma_sync_array_peer (rank, peers, mid, peer);
  67     }
  68 
  69     return ompi_osc_rdma_sync_array_peer (rank, peers + mid, nranks - mid, peer);
  70 }
  71 
  72 bool ompi_osc_rdma_sync_pscw_peer (ompi_osc_rdma_module_t *module, int target, struct ompi_osc_rdma_peer_t **peer)
  73 {
  74     ompi_osc_rdma_sync_t *rdma_sync = &module->all_sync;
  75 
  76     /* check synchronization type */
  77     if (OMPI_OSC_RDMA_SYNC_TYPE_PSCW != rdma_sync->type) {
  78         *peer = NULL;
  79         return false;
  80     }
  81 
  82     return ompi_osc_rdma_sync_array_peer (target, rdma_sync->peer_list.peers, rdma_sync->num_peers, peer);
  83 }

/* [<][>][^][v][top][bottom][index][help] */