Ejemplo n.º 1
0
int main( int argc, char *argv[] )
{
    MPID_NS_Handle ns;
    char           port[1024];
    int            rc;

    /* Create a name service */
    rc = MPID_NS_Create( MPID_INFO_NULL, &ns );
    if (rc) {
	Error( "Could not create name service; rc = %d\n", rc );
    }
    /* publish several names */
    rc = MPID_NS_Publish( ns, MPID_INFO_NULL, "name1", "foo$$12" );
    if (rc) {
	Error( "Could not publish name1; rc = %d\n", rc );
    }
    rc = MPID_NS_Publish( ns, MPID_INFO_NULL, "namea", "bar--14" );
    if (rc) {
	Error( "Could not publish namea; rc = %d\n", rc );
    }
    rc = MPID_NS_Publish( ns, MPID_INFO_NULL, "1-2-3", "testname" );
    if (rc) {
	Error( "Could not publish 1-2-3; rc = %d\n", rc );
    }

    /* Try look ups */
    rc = MPID_NS_Lookup( ns, MPID_INFO_NULL, "name1", port );
    if (rc) {
	Error( "Could not lookup name1; rc = %d\n", rc );
    }
    else {
	if (strcmp( port, "foo$$12" ) != 0) {
	    Error( "Wrong value for port, got %s\n", port );
	}
    }

    rc = MPID_NS_Lookup( ns, MPID_INFO_NULL, "namea", port );
    if (rc) {
	Error( "Could not lookup namea; rc = %d\n", rc );
    }
    else {
	if (strcmp( port, "bar--14" ) != 0) {
	    Error( "Wrong value for port, got %s\n", port );
	}
    }

    rc = MPID_NS_Lookup( ns, MPID_INFO_NULL, "1-2-3", port );
    if (rc) {
	Error( "Could not lookup 1-2-3; rc = %d\n", rc );
    }
    else {
	if (strcmp( port, "testname" ) != 0) {
	    Error( "Wrong value for port, got %s\n", port );
	}
    }

    /* Try a name that isn't published */
    port[0] = 0;
    rc = MPID_NS_Lookup( ns, MPID_INFO_NULL, "name", port );
    if (!rc) {
	Error( "Found port (%s) for unpublished name\n", port );
    }

    rc = MPID_NS_Publish( ns, MPID_INFO_NULL, "name 1", "foo 12" );
    if (rc) {
	Error( "Could not publish \"name 1\"; rc = %d\n", rc );
    }
    rc = MPID_NS_Lookup( ns, MPID_INFO_NULL, "name 1", port );
    if (rc) {
	Error( "Could not lookup \"name 1\"; rc = %d\n", rc );
    }
    else {
	if (strcmp( port, "foo 12" ) != 0) {
	    Error( "Wrong value for port, got %s\n", port );
	}
    }

    /* Note that there are some restrictions in the file-based version */
    rc = MPID_NS_Publish( ns, MPID_INFO_NULL, "name/1", "foo/12a" );
    if (rc) {
	/* Allow publish to fail with some names */
	;
    }
    else {
	rc = MPID_NS_Lookup( ns, MPID_INFO_NULL, "name/1", port );
	if (rc) {
	    Error( "Could not lookup name/1; rc = %d\n", rc );
	}
	else {
	    if (strcmp( port, "foo/12a" ) != 0) {
		Error( "Wrong value for port, got %s\n", port );
	    }
	}
	rc = MPID_NS_Unpublish( ns, MPID_INFO_NULL, "name/1" );
	if (rc) {
	    Error( "Could not unpublish name/1; rc = %d\n", rc );
	}
    }

    /* Try to unpublish the names */
    rc = MPID_NS_Unpublish( ns, MPID_INFO_NULL, "name1" );
    if (rc) {
	Error( "Could not unpublish name1; rc = %d\n", rc );
    }
    rc = MPID_NS_Unpublish( ns, MPID_INFO_NULL, "name 1" );
    if (rc) {
	Error( "Could not unpublish \"name 1\"; rc = %d\n", rc );
    }
    rc = MPID_NS_Unpublish( ns, MPID_INFO_NULL, "namea" );
    if (rc) {
	Error( "Could not unpublish namea; rc = %d\n", rc );
    }
    rc = MPID_NS_Unpublish( ns, MPID_INFO_NULL, "1-2-3" );
    if (rc) {
	Error( "Could not unpublish 1-2-3; rc = %d\n", rc );
    }

    /* If we make it to the end, there are no errors */
    printf( " No Errors\n" );

    return 0;
}
Ejemplo n.º 2
0
/*@
   MPI_Publish_name - Publish a service name for use with MPI_Comm_connect

Input Parameters:
+ service_name - a service name to associate with the port (string) 
. info - implementation-specific information (handle) 
- port_name - a port name (string) 

Notes:
The maximum size string that may be supplied for 'port_name' is
'MPI_MAX_PORT_NAME'. 

.N ThreadSafe

.N Fortran

.N Errors
.N MPI_SUCCESS
.N MPI_ERR_ARG
.N MPI_ERR_INFO
.N MPI_ERR_OTHER
@*/
int MPI_Publish_name(const char *service_name, MPI_Info info, const char *port_name)
{
    static const char FCNAME[] = "MPI_Publish_name";
    int mpi_errno = MPI_SUCCESS;
    MPIR_Info *info_ptr = NULL;
    MPIR_FUNC_TERSE_STATE_DECL(MPID_STATE_MPI_PUBLISH_NAME);

    MPIR_ERRTEST_INITIALIZED_ORDIE();
    
    MPID_THREAD_CS_ENTER(GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX);
    MPIR_FUNC_TERSE_ENTER(MPID_STATE_MPI_PUBLISH_NAME);

    /* Validate parameters, especially handles needing to be converted */
#   ifdef HAVE_ERROR_CHECKING
    {
        MPID_BEGIN_ERROR_CHECKS;
        {
	    MPIR_ERRTEST_INFO_OR_NULL(info, mpi_errno);
        }
        MPID_END_ERROR_CHECKS;
    }
#   endif
    
    /* Get handles to MPI objects. */
    MPIR_Info_get_ptr( info, info_ptr );
    
#   ifdef HAVE_ERROR_CHECKING
    {
        MPID_BEGIN_ERROR_CHECKS;
        {
            /* Validate info_ptr (only if not null) */
	    if (info_ptr)
		MPIR_Info_valid_ptr( info_ptr, mpi_errno );
	    /* Validate character pointers */
	    MPIR_ERRTEST_ARGNULL( service_name, "service_name", mpi_errno );
	    MPIR_ERRTEST_ARGNULL( port_name, "port_name", mpi_errno );
        }
        MPID_END_ERROR_CHECKS;
    }
#   endif /* HAVE_ERROR_CHECKING */

    /* ... body of routine ...  */
    
#   ifdef HAVE_NAMEPUB_SERVICE
    {
	if (!MPIR_Namepub)
	{
	    mpi_errno = MPID_NS_Create( info_ptr, &MPIR_Namepub );
	    if (mpi_errno != MPI_SUCCESS) goto fn_fail;
	    MPIR_Add_finalize( (int (*)(void*))MPID_NS_Free, &MPIR_Namepub, 9 );
	}

	mpi_errno = MPID_NS_Publish( MPIR_Namepub, info_ptr, 
				     (const char *)service_name, 
				     (const char *)port_name );
	if (mpi_errno != MPI_SUCCESS) goto fn_fail;

    }
#   else
    {
	/* No name publishing service available */
	MPIR_ERR_SETANDJUMP(mpi_errno, MPI_ERR_OTHER, "**nonamepub");
    }
#   endif

    /* ... end of body of routine ... */

  fn_exit:
    MPIR_FUNC_TERSE_EXIT(MPID_STATE_MPI_PUBLISH_NAME);
    MPID_THREAD_CS_EXIT(GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX);
    return mpi_errno;
    
  fn_fail:
    /* --BEGIN ERROR HANDLING-- */
#   ifdef HAVE_ERROR_CHECKING
    {
	mpi_errno = MPIR_Err_create_code(
	    mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**mpi_publish_name",
	    "**mpi_publish_name %s %I %s", service_name, info, port_name);
    }
#   endif
    mpi_errno = MPIR_Err_return_comm( NULL, FCNAME, mpi_errno );
    goto fn_exit;
    /* --END ERROR HANDLING-- */
}