root/opal/mca/pmix/pmix4x/pmix/examples/dmodex.c

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

DEFINITIONS

This source file includes following definitions.
  1. opcbfunc
  2. valcbfunc
  3. main

   1 /*
   2  * Copyright (c) 2004-2010 The Trustees of Indiana University and Indiana
   3  *                         University Research and Technology
   4  *                         Corporation.  All rights reserved.
   5  * Copyright (c) 2004-2011 The University of Tennessee and The University
   6  *                         of Tennessee Research Foundation.  All rights
   7  *                         reserved.
   8  * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
   9  *                         University of Stuttgart.  All rights reserved.
  10  * Copyright (c) 2004-2005 The Regents of the University of California.
  11  *                         All rights reserved.
  12  * Copyright (c) 2006-2013 Los Alamos National Security, LLC.
  13  *                         All rights reserved.
  14  * Copyright (c) 2009-2012 Cisco Systems, Inc.  All rights reserved.
  15  * Copyright (c) 2011      Oak Ridge National Labs.  All rights reserved.
  16  * Copyright (c) 2013-2019 Intel, Inc.  All rights reserved.
  17  * Copyright (c) 2015      Mellanox Technologies, Inc.  All rights reserved.
  18  * $COPYRIGHT$
  19  *
  20  * Additional copyrights may follow
  21  *
  22  * $HEADER$
  23  *
  24  */
  25 
  26 #include <stdbool.h>
  27 
  28 #define _GNU_SOURCE
  29 #include <stdio.h>
  30 
  31 #include <stdlib.h>
  32 #include <unistd.h>
  33 #include <time.h>
  34 
  35 #include <pmix.h>
  36 #include "examples.h"
  37 
  38 static uint32_t nprocs;
  39 static pmix_proc_t myproc;
  40 static uint32_t getcount = 0;
  41 
  42 static void opcbfunc(pmix_status_t status, void *cbdata)
  43 {
  44     mylock_t *lock = (mylock_t*)cbdata;
  45 
  46     fprintf(stderr, "%s:%d completed fence_nb\n", myproc.nspace, myproc.rank);
  47     lock->status = status;
  48     DEBUG_WAKEUP_THREAD(lock);
  49 }
  50 
  51 static void valcbfunc(pmix_status_t status,
  52                       pmix_value_t *val, void *cbdata)
  53 {
  54     char *key = (char*)cbdata;
  55 
  56     if (PMIX_SUCCESS == status) {
  57         if (NULL != strstr(key, "local")) {
  58             if (PMIX_UINT64 != val->type) {
  59                 fprintf(stderr, "%s:%d: PMIx_Get_nb Key %s returned wrong type: %d\n", myproc.nspace, myproc.rank, key, val->type);
  60                 goto done;
  61             }
  62             if (1234 != val->data.uint64) {
  63                 fprintf(stderr, "%s:%d: PMIx_Get_nb Key %s returned wrong value: %d\n", myproc.nspace, myproc.rank, key, (int)val->data.uint64);
  64                 goto done;
  65             }
  66         } else if (NULL != strstr(key, "remote")) {
  67             if (PMIX_STRING != val->type) {
  68                 fprintf(stderr, "%s:%d: PMIx_Get_nb Key %s returned wrong type: %d\n", myproc.nspace, myproc.rank, key, val->type);
  69                 goto done;
  70             }
  71             if (0 != strcmp(val->data.string, "1234")) {
  72                 fprintf(stderr, "%s:%d: PMIx_Get_nb Key %s returned wrong value: %s\n", myproc.nspace, myproc.rank, key, val->data.string);
  73                 goto done;
  74             }
  75         } else {
  76             fprintf(stderr, "%s:%d PMIx_Get_nb returned wrong key: %s\n", myproc.nspace, myproc.rank, key);
  77             goto done;
  78         }
  79         fprintf(stderr, "%s:%d PMIx_Get_nb Key %s returned correctly\n", myproc.nspace, myproc.rank, key);
  80     } else {
  81         fprintf(stderr, "%s:%d PMIx_Get_nb Key %s failed\n", myproc.nspace, myproc.rank, key);
  82     }
  83  done:
  84     free(key);
  85     getcount++;
  86 }
  87 
  88 int main(int argc, char **argv)
  89 {
  90     int rc;
  91     pmix_value_t value;
  92     pmix_value_t *val = &value;
  93     char *tmp;
  94     pmix_proc_t proc;
  95     uint32_t n, num_gets;
  96     mylock_t mylock;
  97 
  98     /* init us */
  99     if (PMIX_SUCCESS != (rc = PMIx_Init(&myproc, NULL, 0))) {
 100         fprintf(stderr, "Client ns %s rank %d: PMIx_Init failed: %d\n", myproc.nspace, myproc.rank, rc);
 101         exit(0);
 102     }
 103     fprintf(stderr, "Client ns %s rank %d: Running\n", myproc.nspace, myproc.rank);
 104 
 105     /* get our universe size */
 106     PMIX_PROC_CONSTRUCT(&proc);
 107     (void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
 108     proc.rank = PMIX_RANK_WILDCARD;
 109     if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val))) {
 110         fprintf(stderr, "Client ns %s rank %d: PMIx_Get universe size failed: %d\n", myproc.nspace, myproc.rank, rc);
 111         goto done;
 112     }
 113     nprocs = val->data.uint32;
 114     PMIX_VALUE_RELEASE(val);
 115     fprintf(stderr, "Client %s:%d universe size %d\n", myproc.nspace, myproc.rank, nprocs);
 116 
 117     /* put a few values */
 118     if (0 > asprintf(&tmp, "%s-%d-internal", myproc.nspace, myproc.rank)) {
 119         exit(1);
 120     }
 121     value.type = PMIX_UINT32;
 122     value.data.uint32 = 1234;
 123     if (PMIX_SUCCESS != (rc = PMIx_Store_internal(&myproc, tmp, &value))) {
 124         fprintf(stderr, "Client ns %s rank %d: PMIx_Store_internal failed: %d\n", myproc.nspace, myproc.rank, rc);
 125         goto done;
 126     }
 127     free(tmp);
 128 
 129     if (0 > asprintf(&tmp, "%s-%d-local", myproc.nspace, myproc.rank)) {
 130         exit(1);
 131     }
 132     value.type = PMIX_UINT64;
 133     value.data.uint64 = 1234;
 134     if (PMIX_SUCCESS != (rc = PMIx_Put(PMIX_LOCAL, tmp, &value))) {
 135         fprintf(stderr, "Client ns %s rank %d: PMIx_Put internal failed: %d\n", myproc.nspace, myproc.rank, rc);
 136         goto done;
 137     }
 138     free(tmp);
 139 
 140     if (0 > asprintf(&tmp, "%s-%d-remote", myproc.nspace, myproc.rank)) {
 141         exit(1);
 142     }
 143     value.type = PMIX_STRING;
 144     value.data.string = "1234";
 145     if (PMIX_SUCCESS != (rc = PMIx_Put(PMIX_REMOTE, tmp, &value))) {
 146         fprintf(stderr, "Client ns %s rank %d: PMIx_Put internal failed: %d\n", myproc.nspace, myproc.rank, rc);
 147         goto done;
 148     }
 149     free(tmp);
 150 
 151     /* introduce a delay by one rank so we can check what happens
 152      * if a "get" is received prior to data being provided */
 153 
 154     if (0 == myproc.rank) {
 155         sleep(2);
 156     }
 157 
 158     /* commit the data to the server */
 159     if (PMIX_SUCCESS != (rc = PMIx_Commit())) {
 160         fprintf(stderr, "Client ns %s rank %d: PMIx_Commit failed: %d\n", myproc.nspace, myproc.rank, rc);
 161         goto done;
 162     }
 163 
 164     /* call fence_nb, but don't return any data */
 165     PMIX_PROC_CONSTRUCT(&proc);
 166     (void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
 167     proc.rank = PMIX_RANK_WILDCARD;
 168     DEBUG_CONSTRUCT_LOCK(&mylock);
 169     if (PMIX_SUCCESS != (rc = PMIx_Fence_nb(&proc, 1, NULL, 0, opcbfunc, &mylock))) {
 170         fprintf(stderr, "Client ns %s rank %d: PMIx_Fence failed: %d\n", myproc.nspace, myproc.rank, rc);
 171         DEBUG_DESTRUCT_LOCK(&mylock);
 172         goto done;
 173     }
 174 
 175     /* get the committed data - ask for someone who doesn't exist as well */
 176     num_gets = 0;
 177     for (n=0; n <= nprocs; n++) {
 178         if (0 > asprintf(&tmp, "%s-%d-local", myproc.nspace, n)) {
 179             exit(1);
 180         }
 181         (void)strncpy(proc.nspace, tmp, PMIX_MAX_NSLEN);
 182         proc.rank = n;
 183         if (PMIX_SUCCESS != (rc = PMIx_Get_nb(&proc, tmp,
 184                                               NULL, 0, valcbfunc, tmp))) {
 185             fprintf(stderr, "Client ns %s rank %d: PMIx_Get %s failed: %d\n", myproc.nspace, n, tmp, rc);
 186             goto done;
 187         }
 188         ++num_gets;
 189         if (0 > asprintf(&tmp, "%s-%d-remote", myproc.nspace, n)) {
 190             exit(1);
 191         }
 192         (void)strncpy(proc.nspace, tmp, PMIX_MAX_NSLEN);
 193         if (PMIX_SUCCESS != (rc = PMIx_Get_nb(&proc, tmp,
 194                                               NULL, 0, valcbfunc, tmp))) {
 195             fprintf(stderr, "Client ns %s rank %d: PMIx_Get %s failed: %d\n", myproc.nspace, n, tmp, rc);
 196             goto done;
 197         }
 198         ++num_gets;
 199     }
 200 
 201     /* wait for the first fence to finish */
 202     DEBUG_WAIT_THREAD(&mylock);
 203 
 204     /* wait for all my "get" calls to complete */
 205     while (getcount < num_gets) {
 206         struct timespec ts;
 207         ts.tv_sec = 0;
 208         ts.tv_nsec = 100000;
 209         nanosleep(&ts, NULL);
 210     }
 211 
 212     /* call fence again so everyone waits before leaving */
 213     (void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
 214     proc.rank = PMIX_RANK_WILDCARD;
 215     if (PMIX_SUCCESS != (rc = PMIx_Fence(&proc, 1, NULL, 0))) {
 216         fprintf(stderr, "Client ns %s rank %d: PMIx_Fence failed: %d\n", myproc.nspace, myproc.rank, rc);
 217         goto done;
 218     }
 219 
 220  done:
 221     /* finalize us */
 222     fprintf(stderr, "Client ns %s rank %d: Finalizing", myproc.nspace, myproc.rank);
 223     if (PMIX_SUCCESS != (rc = PMIx_Finalize(NULL, 0))) {
 224         fprintf(stderr, "Client ns %s rank %d:PMIx_Finalize failed: %d\n", myproc.nspace, myproc.rank, rc);
 225     } else {
 226         fprintf(stderr, "Client ns %s rank %d:PMIx_Finalize successfully completed\n", myproc.nspace, myproc.rank);
 227     }
 228     fflush(stderr);
 229     return(0);
 230 }

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