root/oshmem/shmem/c/shmem_wait.c

/* [<][>][^][v][top][bottom][index][help] */
   1 /*
   2  * Copyright (c) 2013      Mellanox Technologies, Inc.
   3  *                         All rights reserved.
   4  * $COPYRIGHT$
   5  *
   6  * Additional copyrights may follow
   7  *
   8  * $HEADER$
   9  */
  10 #include "oshmem_config.h"
  11 
  12 #include "oshmem/constants.h"
  13 #include "oshmem/include/shmem.h"
  14 #include "oshmem/include/shmemx.h"
  15 
  16 #include "oshmem/runtime/runtime.h"
  17 
  18 #include "oshmem/mca/spml/spml.h"
  19 
  20 /*
  21  * These routines force the calling PE to wait until var is no longer equal to value.
  22  * A call to any shmem_wait() routine does not return until some other processor makes the
  23  * value at address var not equal to value.
  24  */
  25 #define SHMEM_TYPE_WAIT(type_name, type, code, prefix)    \
  26     void prefix##type_name##_wait(type *addr, type value) \
  27     {                                                               \
  28         int rc = OSHMEM_SUCCESS;                                    \
  29                                                                     \
  30         RUNTIME_CHECK_INIT();                                       \
  31                                                                     \
  32         rc = MCA_SPML_CALL(wait(                                    \
  33             (void*)addr,                                            \
  34             SHMEM_CMP_NE,                                           \
  35             (void*)&value,                                          \
  36             code));                                                 \
  37         RUNTIME_CHECK_RC(rc);                                       \
  38                                                                     \
  39         return ;                                                    \
  40     }
  41 
  42 #if OSHMEM_PROFILING
  43 #include "oshmem/include/pshmem.h"
  44 #pragma weak shmem_wait = pshmem_wait
  45 #pragma weak shmem_short_wait = pshmem_short_wait
  46 #pragma weak shmem_int_wait = pshmem_int_wait
  47 #pragma weak shmem_long_wait = pshmem_long_wait
  48 #pragma weak shmem_longlong_wait = pshmem_longlong_wait
  49 #pragma weak shmemx_int32_wait = pshmemx_int32_wait
  50 #pragma weak shmemx_int64_wait = pshmemx_int64_wait
  51 
  52 #pragma weak shmem_short_wait_until = pshmem_short_wait_until
  53 #pragma weak shmem_int_wait_until = pshmem_int_wait_until
  54 #pragma weak shmem_long_wait_until = pshmem_long_wait_until
  55 #pragma weak shmem_longlong_wait_until = pshmem_longlong_wait_until
  56 #pragma weak shmem_ushort_wait_until = pshmem_ushort_wait_until
  57 #pragma weak shmem_uint_wait_until = pshmem_uint_wait_until
  58 #pragma weak shmem_ulong_wait_until = pshmem_ulong_wait_until
  59 #pragma weak shmem_ulonglong_wait_until = pshmem_ulonglong_wait_until
  60 #pragma weak shmem_int32_wait_until = pshmem_int32_wait_until
  61 #pragma weak shmem_int64_wait_until = pshmem_int64_wait_until
  62 #pragma weak shmem_uint32_wait_until = pshmem_uint32_wait_until
  63 #pragma weak shmem_uint64_wait_until = pshmem_uint64_wait_until
  64 #pragma weak shmem_size_wait_until = pshmem_size_wait_until
  65 #pragma weak shmem_ptrdiff_wait_until = pshmem_ptrdiff_wait_until
  66 
  67 #pragma weak shmemx_int32_wait_until = pshmemx_int32_wait_until
  68 #pragma weak shmemx_int64_wait_until = pshmemx_int64_wait_until
  69 
  70 #pragma weak shmem_short_test = pshmem_short_test
  71 #pragma weak shmem_int_test = pshmem_int_test
  72 #pragma weak shmem_long_test = pshmem_long_test
  73 #pragma weak shmem_longlong_test = pshmem_longlong_test
  74 #pragma weak shmem_ushort_test = pshmem_ushort_test
  75 #pragma weak shmem_uint_test = pshmem_uint_test
  76 #pragma weak shmem_ulong_test = pshmem_ulong_test
  77 #pragma weak shmem_ulonglong_test = pshmem_ulonglong_test
  78 #pragma weak shmem_int32_test = pshmem_int32_test
  79 #pragma weak shmem_int64_test = pshmem_int64_test
  80 #pragma weak shmem_uint32_test = pshmem_uint32_test
  81 #pragma weak shmem_uint64_test = pshmem_uint64_test
  82 #pragma weak shmem_size_test = pshmem_size_test
  83 #pragma weak shmem_ptrdiff_test = pshmem_ptrdiff_test
  84 #include "oshmem/shmem/c/profile/defines.h"
  85 #endif
  86 
  87 SHMEM_TYPE_WAIT(, volatile long, SHMEM_LONG, shmem)
  88 SHMEM_TYPE_WAIT(_short, volatile short, SHMEM_SHORT, shmem)
  89 SHMEM_TYPE_WAIT(_int, volatile int, SHMEM_INT, shmem)
  90 SHMEM_TYPE_WAIT(_long, volatile long, SHMEM_LONG, shmem)
  91 SHMEM_TYPE_WAIT(_longlong, volatile long long, SHMEM_LLONG, shmem)
  92 SHMEM_TYPE_WAIT(_int32, int32_t, SHMEM_INT32_T, shmemx)
  93 SHMEM_TYPE_WAIT(_int64, int64_t, SHMEM_INT64_T, shmemx)
  94 
  95 #define SHMEM_TYPE_WAIT_UNTIL(type_name, type, code, prefix)    \
  96     void prefix##type_name##_wait_until(type *addr, int cmp, type value)   \
  97     {                                                               \
  98         int rc = OSHMEM_SUCCESS;                                    \
  99                                                                     \
 100         RUNTIME_CHECK_INIT();                                       \
 101                                                                     \
 102         rc = MCA_SPML_CALL(wait(                                    \
 103             (void*)addr,                                            \
 104             cmp,                                                    \
 105             (void*)&value,                                          \
 106             code));                                                 \
 107         RUNTIME_CHECK_RC(rc);                                       \
 108                                                                     \
 109         return ;                                                    \
 110     }
 111 
 112 SHMEM_TYPE_WAIT_UNTIL(_short, volatile short, SHMEM_SHORT, shmem)
 113 SHMEM_TYPE_WAIT_UNTIL(_int, volatile int, SHMEM_INT, shmem)
 114 SHMEM_TYPE_WAIT_UNTIL(_long, volatile long, SHMEM_LONG, shmem)
 115 SHMEM_TYPE_WAIT_UNTIL(_longlong, volatile long long, SHMEM_LLONG, shmem)
 116 SHMEM_TYPE_WAIT_UNTIL(_ushort, volatile unsigned short, SHMEM_SHORT, shmem)
 117 SHMEM_TYPE_WAIT_UNTIL(_uint, volatile unsigned int, SHMEM_INT, shmem)
 118 SHMEM_TYPE_WAIT_UNTIL(_ulong, volatile unsigned long, SHMEM_LONG, shmem)
 119 SHMEM_TYPE_WAIT_UNTIL(_ulonglong, volatile unsigned long long, SHMEM_LLONG, shmem)
 120 SHMEM_TYPE_WAIT_UNTIL(_int32, volatile int32_t, SHMEM_LLONG, shmem)
 121 SHMEM_TYPE_WAIT_UNTIL(_int64, volatile int64_t, SHMEM_LLONG, shmem)
 122 SHMEM_TYPE_WAIT_UNTIL(_uint32, volatile uint32_t, SHMEM_LLONG, shmem)
 123 SHMEM_TYPE_WAIT_UNTIL(_uint64, volatile uint64_t, SHMEM_LLONG, shmem)
 124 SHMEM_TYPE_WAIT_UNTIL(_size, volatile size_t, SHMEM_LLONG, shmem)
 125 SHMEM_TYPE_WAIT_UNTIL(_ptrdiff, volatile ptrdiff_t, SHMEM_LLONG, shmem)
 126 
 127 SHMEM_TYPE_WAIT_UNTIL(_int32, int32_t, SHMEM_INT32_T, shmemx)
 128 SHMEM_TYPE_WAIT_UNTIL(_int64, int64_t, SHMEM_INT64_T, shmemx)
 129 
 130 #define SHMEM_TYPE_TEST(type_name, type, code, prefix)              \
 131     int prefix##type_name##_test(type *addr, int cmp, type value)   \
 132     {                                                               \
 133         int rc = OSHMEM_SUCCESS;                                    \
 134         int out_value;                                              \
 135                                                                     \
 136         RUNTIME_CHECK_INIT();                                       \
 137                                                                     \
 138         rc = MCA_SPML_CALL(test(                                    \
 139             (void*)addr,                                            \
 140             cmp,                                                    \
 141             (void*)&value,                                          \
 142             code, &out_value));                                     \
 143         RUNTIME_CHECK_RC(rc);                                       \
 144                                                                     \
 145         return out_value;                                           \
 146     }
 147 
 148 SHMEM_TYPE_TEST(_short, volatile short, SHMEM_SHORT, shmem)
 149 SHMEM_TYPE_TEST(_int, volatile int, SHMEM_INT, shmem)
 150 SHMEM_TYPE_TEST(_long, volatile long, SHMEM_LONG, shmem)
 151 SHMEM_TYPE_TEST(_longlong, volatile long long, SHMEM_LLONG, shmem)
 152 SHMEM_TYPE_TEST(_ushort, volatile unsigned short, SHMEM_SHORT, shmem)
 153 SHMEM_TYPE_TEST(_uint, volatile unsigned int, SHMEM_INT, shmem)
 154 SHMEM_TYPE_TEST(_ulong, volatile unsigned long, SHMEM_LONG, shmem)
 155 SHMEM_TYPE_TEST(_ulonglong, volatile unsigned long long, SHMEM_LLONG, shmem)
 156 SHMEM_TYPE_TEST(_int32, volatile int32_t, SHMEM_LLONG, shmem)
 157 SHMEM_TYPE_TEST(_int64, volatile int64_t, SHMEM_LLONG, shmem)
 158 SHMEM_TYPE_TEST(_uint32, volatile uint32_t, SHMEM_LLONG, shmem)
 159 SHMEM_TYPE_TEST(_uint64, volatile uint64_t, SHMEM_LLONG, shmem)
 160 SHMEM_TYPE_TEST(_size, volatile size_t, SHMEM_LLONG, shmem)
 161 SHMEM_TYPE_TEST(_ptrdiff, volatile ptrdiff_t, SHMEM_LLONG, shmem)

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