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; }
/*@ 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-- */ }