Blame src/nameserv/pmi/pmi_nameserv.c

Packit Service c5cf8c
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit Service c5cf8c
/*
Packit Service c5cf8c
 *  (C) 2001 by Argonne National Laboratory.
Packit Service c5cf8c
 *      See COPYRIGHT in top-level directory.
Packit Service c5cf8c
 */
Packit Service c5cf8c
Packit Service c5cf8c
/*
Packit Service c5cf8c
 * This file contains a simple PMI-based implementation of the name server routines.
Packit Service c5cf8c
 */
Packit Service c5cf8c
Packit Service c5cf8c
#include "mpiimpl.h"
Packit Service c5cf8c
#include "namepub.h"
Packit Service c5cf8c
#ifdef USE_PMI2_API
Packit Service c5cf8c
#include "pmi2.h"
Packit Service c5cf8c
#elif defined(USE_PMIX_API)
Packit Service c5cf8c
#include "pmix.h"
Packit Service c5cf8c
#else
Packit Service c5cf8c
#include "pmi.h"
Packit Service c5cf8c
#endif
Packit Service c5cf8c
Packit Service c5cf8c
/* style: allow:fprintf:1 sig:0 */
Packit Service c5cf8c
/* For writing the name/service pair */
Packit Service c5cf8c
Packit Service c5cf8c
/* Define the name service handle */
Packit Service c5cf8c
#define MPID_MAX_NAMEPUB 64
Packit Service c5cf8c
struct MPID_NS_Handle {
Packit Service c5cf8c
    int dummy;
Packit Service c5cf8c
};                              /* unused for now */
Packit Service c5cf8c
Packit Service c5cf8c
#undef FUNCNAME
Packit Service c5cf8c
#define FUNCNAME MPID_NS_Create
Packit Service c5cf8c
#undef FCNAME
Packit Service c5cf8c
#define FCNAME MPL_QUOTE(FUNCNAME)
Packit Service c5cf8c
int MPID_NS_Create(const MPIR_Info * info_ptr, MPID_NS_Handle * handle_ptr)
Packit Service c5cf8c
{
Packit Service c5cf8c
    static struct MPID_NS_Handle nsHandleWithNoData;
Packit Service c5cf8c
Packit Service c5cf8c
    MPL_UNREFERENCED_ARG(info_ptr);
Packit Service c5cf8c
    /* MPID_NS_Create() should always create a valid handle */
Packit Service c5cf8c
    *handle_ptr = &nsHandleWithNoData;  /* The name service needs no local data */
Packit Service c5cf8c
    return 0;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
#undef FUNCNAME
Packit Service c5cf8c
#define FUNCNAME MPID_NS_Publish
Packit Service c5cf8c
#undef FCNAME
Packit Service c5cf8c
#define FCNAME MPL_QUOTE(FUNCNAME)
Packit Service c5cf8c
int MPID_NS_Publish(MPID_NS_Handle handle, const MPIR_Info * info_ptr,
Packit Service c5cf8c
                    const char service_name[], const char port[])
Packit Service c5cf8c
{
Packit Service c5cf8c
    int mpi_errno = MPI_SUCCESS;
Packit Service c5cf8c
    int rc;
Packit Service c5cf8c
    MPL_UNREFERENCED_ARG(info_ptr);
Packit Service c5cf8c
    MPL_UNREFERENCED_ARG(handle);
Packit Service c5cf8c
Packit Service c5cf8c
#ifdef USE_PMI2_API
Packit Service c5cf8c
    /* release the global CS for PMI calls */
Packit Service c5cf8c
    MPID_THREAD_CS_EXIT(GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX);
Packit Service c5cf8c
    rc = PMI2_Nameserv_publish(service_name, info_ptr, port);
Packit Service c5cf8c
    MPID_THREAD_CS_ENTER(GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX);
Packit Service c5cf8c
#elif defined(USE_PMIX_API)
Packit Service c5cf8c
    MPIR_Assert(0);
Packit Service c5cf8c
#else
Packit Service c5cf8c
    rc = PMI_Publish_name(service_name, port);
Packit Service c5cf8c
#endif
Packit Service c5cf8c
    MPIR_ERR_CHKANDJUMP1(rc, mpi_errno, MPI_ERR_NAME, "**namepubnotpub", "**namepubnotpub %s",
Packit Service c5cf8c
                         service_name);
Packit Service c5cf8c
Packit Service c5cf8c
  fn_fail:
Packit Service c5cf8c
    return mpi_errno;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
#undef FUNCNAME
Packit Service c5cf8c
#define FUNCNAME MPID_NS_Lookup
Packit Service c5cf8c
#undef FCNAME
Packit Service c5cf8c
#define FCNAME MPL_QUOTE(FUNCNAME)
Packit Service c5cf8c
int MPID_NS_Lookup(MPID_NS_Handle handle, const MPIR_Info * info_ptr,
Packit Service c5cf8c
                   const char service_name[], char port[])
Packit Service c5cf8c
{
Packit Service c5cf8c
    int mpi_errno = MPI_SUCCESS;
Packit Service c5cf8c
    int rc;
Packit Service c5cf8c
    MPL_UNREFERENCED_ARG(info_ptr);
Packit Service c5cf8c
    MPL_UNREFERENCED_ARG(handle);
Packit Service c5cf8c
Packit Service c5cf8c
#ifdef USE_PMI2_API
Packit Service c5cf8c
    /* release the global CS for PMI calls */
Packit Service c5cf8c
    MPID_THREAD_CS_EXIT(GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX);
Packit Service c5cf8c
    rc = PMI2_Nameserv_lookup(service_name, info_ptr, port, MPI_MAX_PORT_NAME);
Packit Service c5cf8c
    MPID_THREAD_CS_ENTER(GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX);
Packit Service c5cf8c
#elif defined(USE_PMIX_API)
Packit Service c5cf8c
    MPIR_Assert(0);
Packit Service c5cf8c
#else
Packit Service c5cf8c
    rc = PMI_Lookup_name(service_name, port);
Packit Service c5cf8c
#endif
Packit Service c5cf8c
    MPIR_ERR_CHKANDJUMP1(rc, mpi_errno, MPI_ERR_NAME, "**namepubnotfound", "**namepubnotfound %s",
Packit Service c5cf8c
                         service_name);
Packit Service c5cf8c
Packit Service c5cf8c
  fn_fail:
Packit Service c5cf8c
    return mpi_errno;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
#undef FUNCNAME
Packit Service c5cf8c
#define FUNCNAME MPID_NS_Unpublish
Packit Service c5cf8c
#undef FCNAME
Packit Service c5cf8c
#define FCNAME MPL_QUOTE(FUNCNAME)
Packit Service c5cf8c
int MPID_NS_Unpublish(MPID_NS_Handle handle, const MPIR_Info * info_ptr, const char service_name[])
Packit Service c5cf8c
{
Packit Service c5cf8c
    int mpi_errno = MPI_SUCCESS;
Packit Service c5cf8c
    int rc;
Packit Service c5cf8c
    MPL_UNREFERENCED_ARG(info_ptr);
Packit Service c5cf8c
    MPL_UNREFERENCED_ARG(handle);
Packit Service c5cf8c
Packit Service c5cf8c
#ifdef USE_PMI2_API
Packit Service c5cf8c
    /* release the global CS for PMI calls */
Packit Service c5cf8c
    MPID_THREAD_CS_EXIT(GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX);
Packit Service c5cf8c
    rc = PMI2_Nameserv_unpublish(service_name, info_ptr);
Packit Service c5cf8c
    MPID_THREAD_CS_ENTER(GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX);
Packit Service c5cf8c
#elif defined(USE_PMIX_API)
Packit Service c5cf8c
    MPIR_Assert(0);
Packit Service c5cf8c
#else
Packit Service c5cf8c
    rc = PMI_Unpublish_name(service_name);
Packit Service c5cf8c
#endif
Packit Service c5cf8c
    MPIR_ERR_CHKANDJUMP1(rc, mpi_errno, MPI_ERR_SERVICE, "**namepubnotunpub",
Packit Service c5cf8c
                         "**namepubnotunpub %s", service_name);
Packit Service c5cf8c
Packit Service c5cf8c
  fn_fail:
Packit Service c5cf8c
    return mpi_errno;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
#undef FUNCNAME
Packit Service c5cf8c
#define FUNCNAME MPID_NS_Free
Packit Service c5cf8c
#undef FCNAME
Packit Service c5cf8c
#define FCNAME MPL_QUOTE(FUNCNAME)
Packit Service c5cf8c
int MPID_NS_Free(MPID_NS_Handle * handle_ptr)
Packit Service c5cf8c
{
Packit Service c5cf8c
    /* MPID_NS_Handle is Null */
Packit Service c5cf8c
    MPL_UNREFERENCED_ARG(handle_ptr);
Packit Service c5cf8c
    return 0;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
#if 0
Packit Service c5cf8c
/* PMI_Put/Get version */
Packit Service c5cf8c
Packit Service c5cf8c
/* -*- Mode: C; c-basic-offset:4 ; -*- */
Packit Service c5cf8c
/*
Packit Service c5cf8c
 *  (C) 2001 by Argonne National Laboratory.
Packit Service c5cf8c
 *      See COPYRIGHT in top-level directory.
Packit Service c5cf8c
 */
Packit Service c5cf8c
Packit Service c5cf8c
/*
Packit Service c5cf8c
 * This file contains a simple implementation of the name server routines,
Packit Service c5cf8c
 * using the PMI interface.
Packit Service c5cf8c
 */
Packit Service c5cf8c
#include "mpiimpl.h"
Packit Service c5cf8c
#include "namepub.h"
Packit Service c5cf8c
#include "pmi.h"
Packit Service c5cf8c
Packit Service c5cf8c
/* Define the name service handle */
Packit Service c5cf8c
struct MPID_NS_Handle {
Packit Service c5cf8c
    char *kvsname;
Packit Service c5cf8c
};
Packit Service c5cf8c
Packit Service c5cf8c
#undef FUNCNAME
Packit Service c5cf8c
#define FUNCNAME MPID_NS_Create
Packit Service c5cf8c
#undef FCNAME
Packit Service c5cf8c
#define FCNAME MPL_QUOTE(FUNCNAME)
Packit Service c5cf8c
int MPID_NS_Create(const MPIR_Info * info_ptr, MPID_NS_Handle * handle_ptr)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int err;
Packit Service c5cf8c
    int length;
Packit Service c5cf8c
    char *pmi_namepub_kvs;
Packit Service c5cf8c
Packit Service c5cf8c
    *handle_ptr = (MPID_NS_Handle) MPL_malloc(sizeof(struct MPID_NS_Handle));
Packit Service c5cf8c
    /* --BEGIN ERROR HANDLING-- */
Packit Service c5cf8c
    if (!*handle_ptr) {
Packit Service c5cf8c
        err =
Packit Service c5cf8c
            MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER,
Packit Service c5cf8c
                                 "**nomem", 0);
Packit Service c5cf8c
        return err;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    /* --END ERROR HANDLING-- */
Packit Service c5cf8c
Packit Service c5cf8c
    err = PMI_KVS_Get_name_length_max(&length);
Packit Service c5cf8c
    /* --BEGIN ERROR HANDLING-- */
Packit Service c5cf8c
    if (err != PMI_SUCCESS) {
Packit Service c5cf8c
        err =
Packit Service c5cf8c
            MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER,
Packit Service c5cf8c
                                 "**fail", 0);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    /* --END ERROR HANDLING-- */
Packit Service c5cf8c
Packit Service c5cf8c
    (*handle_ptr)->kvsname = (char *) MPL_malloc(length);
Packit Service c5cf8c
    /* --BEGIN ERROR HANDLING-- */
Packit Service c5cf8c
    if (!(*handle_ptr)->kvsname) {
Packit Service c5cf8c
        err =
Packit Service c5cf8c
            MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER,
Packit Service c5cf8c
                                 "**nomem", 0);
Packit Service c5cf8c
        return err;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    /* --END ERROR HANDLING-- */
Packit Service c5cf8c
Packit Service c5cf8c
    pmi_namepub_kvs = getenv("PMI_NAMEPUB_KVS");
Packit Service c5cf8c
    if (pmi_namepub_kvs) {
Packit Service c5cf8c
        MPL_strncpy((*handle_ptr)->kvsname, pmi_namepub_kvs, length);
Packit Service c5cf8c
    } else {
Packit Service c5cf8c
        err = PMI_KVS_Get_my_name((*handle_ptr)->kvsname, length);
Packit Service c5cf8c
        /* --BEGIN ERROR HANDLING-- */
Packit Service c5cf8c
        if (err != PMI_SUCCESS) {
Packit Service c5cf8c
            err =
Packit Service c5cf8c
                MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__,
Packit Service c5cf8c
                                     MPI_ERR_OTHER, "**fail", 0);
Packit Service c5cf8c
        }
Packit Service c5cf8c
        /* --END ERROR HANDLING-- */
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /*printf("namepub kvs: <%s>\n", (*handle_ptr)->kvsname);fflush(stdout); */
Packit Service c5cf8c
    return 0;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
#undef FUNCNAME
Packit Service c5cf8c
#define FUNCNAME MPID_NS_Publish
Packit Service c5cf8c
#undef FCNAME
Packit Service c5cf8c
#define FCNAME MPL_QUOTE(FUNCNAME)
Packit Service c5cf8c
int MPID_NS_Publish(MPID_NS_Handle handle, const MPIR_Info * info_ptr,
Packit Service c5cf8c
                    const char service_name[], const char port[])
Packit Service c5cf8c
{
Packit Service c5cf8c
    int err;
Packit Service c5cf8c
Packit Service c5cf8c
    /*printf("publish kvs: <%s>\n", handle->kvsname);fflush(stdout); */
Packit Service c5cf8c
    err = PMI_KVS_Put(handle->kvsname, service_name, port);
Packit Service c5cf8c
    /* --BEGIN ERROR HANDLING-- */
Packit Service c5cf8c
    if (err != PMI_SUCCESS) {
Packit Service c5cf8c
        err =
Packit Service c5cf8c
            MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER,
Packit Service c5cf8c
                                 "**pmi_kvs_put", 0);
Packit Service c5cf8c
        return err;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    /* --END ERROR HANDLING-- */
Packit Service c5cf8c
    err = PMI_KVS_Commit(handle->kvsname);
Packit Service c5cf8c
    /* --BEGIN ERROR HANDLING-- */
Packit Service c5cf8c
    if (err != PMI_SUCCESS) {
Packit Service c5cf8c
        err =
Packit Service c5cf8c
            MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER,
Packit Service c5cf8c
                                 "**pmi_kvs_commit", 0);
Packit Service c5cf8c
        return err;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    /* --END ERROR HANDLING-- */
Packit Service c5cf8c
Packit Service c5cf8c
    return 0;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
#undef FUNCNAME
Packit Service c5cf8c
#define FUNCNAME MPID_NS_Lookup
Packit Service c5cf8c
#undef FCNAME
Packit Service c5cf8c
#define FCNAME MPL_QUOTE(FUNCNAME)
Packit Service c5cf8c
int MPID_NS_Lookup(MPID_NS_Handle handle, const MPIR_Info * info_ptr,
Packit Service c5cf8c
                   const char service_name[], char port[])
Packit Service c5cf8c
{
Packit Service c5cf8c
    int err;
Packit Service c5cf8c
Packit Service c5cf8c
    /*printf("lookup kvs: <%s>\n", handle->kvsname);fflush(stdout); */
Packit Service c5cf8c
    err = PMI_KVS_Get(handle->kvsname, service_name, port, MPI_MAX_PORT_NAME);
Packit Service c5cf8c
    /* --BEGIN ERROR HANDLING-- */
Packit Service c5cf8c
    if (err != PMI_SUCCESS) {
Packit Service c5cf8c
        err =
Packit Service c5cf8c
            MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_NAME,
Packit Service c5cf8c
                                 "**pmi_kvs_get", 0);
Packit Service c5cf8c
        return err;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    /* --END ERROR HANDLING-- */
Packit Service c5cf8c
Packit Service c5cf8c
    if (port[0] == '\0') {
Packit Service c5cf8c
        return MPI_ERR_NAME;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    return 0;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
#undef FUNCNAME
Packit Service c5cf8c
#define FUNCNAME MPID_NS_Unpublish
Packit Service c5cf8c
#undef FCNAME
Packit Service c5cf8c
#define FCNAME MPL_QUOTE(FUNCNAME)
Packit Service c5cf8c
int MPID_NS_Unpublish(MPID_NS_Handle handle, const MPIR_Info * info_ptr, const char service_name[])
Packit Service c5cf8c
{
Packit Service c5cf8c
    int err;
Packit Service c5cf8c
Packit Service c5cf8c
    /*printf("unpublish kvs: <%s>\n", handle->kvsname);fflush(stdout); */
Packit Service c5cf8c
    /* This assumes you can put the same key more than once which breaks the PMI specification */
Packit Service c5cf8c
    err = PMI_KVS_Put(handle->kvsname, service_name, "");
Packit Service c5cf8c
    /* --BEGIN ERROR HANDLING-- */
Packit Service c5cf8c
    if (err != PMI_SUCCESS) {
Packit Service c5cf8c
        err =
Packit Service c5cf8c
            MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER,
Packit Service c5cf8c
                                 "**pmi_kvs_put", 0);
Packit Service c5cf8c
        return err;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    /* --END ERROR HANDLING-- */
Packit Service c5cf8c
    err = PMI_KVS_Commit(handle->kvsname);
Packit Service c5cf8c
    /* --BEGIN ERROR HANDLING-- */
Packit Service c5cf8c
    if (err != PMI_SUCCESS) {
Packit Service c5cf8c
        err =
Packit Service c5cf8c
            MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER,
Packit Service c5cf8c
                                 "**pmi_kvs_commit", 0);
Packit Service c5cf8c
        return err;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    /* --END ERROR HANDLING-- */
Packit Service c5cf8c
Packit Service c5cf8c
    return 0;
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
#undef FUNCNAME
Packit Service c5cf8c
#define FUNCNAME MPID_NS_Free
Packit Service c5cf8c
#undef FCNAME
Packit Service c5cf8c
#define FCNAME MPL_QUOTE(FUNCNAME)
Packit Service c5cf8c
int MPID_NS_Free(MPID_NS_Handle * handle_ptr)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int err;
Packit Service c5cf8c
Packit Service c5cf8c
    MPL_free((*handle_ptr)->kvsname);
Packit Service c5cf8c
    MPL_free(*handle_ptr);
Packit Service c5cf8c
    *handle_ptr = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    return 0;
Packit Service c5cf8c
}
Packit Service c5cf8c
#endif