Blame src/nameserv/pmi/pmi_nameserv.c

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