
#include <stdio.h>
#include <pmix.h>
#include <assert.h>

int main(int argc, char **argv)
{
        pmix_proc_t myproc;
        pmix_status_t rc;

        rc = PMIx_Init(&myproc, NULL, 0);
        assert(PMIX_SUCCESS == rc);

        if (myproc.rank == 0 ) {
                pmix_info_t *info;
                PMIX_INFO_CREATE(info, 1);
                snprintf(info[0].key, PMIX_MAX_KEYLEN, "magic-found");
                info[0].value.type = PMIX_STRING;
                info[0].value.data.string = "yes";
                rc = PMIx_Publish(info, 1);
                assert(PMIX_SUCCESS == rc);
        }

        printf("I am rank %d\n", myproc.rank);

        {
                bool flag;
                pmix_info_t *info;
                PMIX_INFO_CREATE(info, 1);
                flag = true;
                PMIX_INFO_LOAD(info, PMIX_COLLECT_DATA, &flag, PMIX_BOOL);
                rc = PMIx_Fence(&myproc, 1, info, 1);
                assert(PMIX_SUCCESS == rc);
                PMIX_INFO_FREE(info, 1);
        }

        if (myproc.rank == 1) {
                int i;
                pmix_pdata_t *pdata;
                PMIX_PDATA_CREATE(pdata, 2);
                snprintf(pdata[0].key, PMIX_MAX_KEYLEN, "magic-found");
                snprintf(pdata[1].key, PMIX_MAX_KEYLEN, "magic-not-found");
                rc = PMIx_Lookup(&pdata[0], 2, NULL, 0);
                assert((PMIX_SUCCESS == rc) || (PMIX_ERR_NOT_FOUND == rc));
                for ( i = 0 ; i < 2 ; i++ )
                        if (pdata[i].value.type == PMIX_STRING)
                                printf("Found[%d] %d %s\n", i, pdata[i].value.type, pdata[i].value.data.string);
                        else
                                printf("Found[%d] %d\n", i, pdata[i].value.type);
                PMIX_PDATA_FREE(pdata, 1);
        }

        rc = PMIx_Finalize(NULL, 0);
        assert(PMIX_SUCCESS == rc);

}
