/*@ MPI_Unpublish_name - Unpublish a service name published with MPI_Publish_name Input Parameters: + service_name - a service name (string) . info - implementation-specific information (handle) - port_name - a port name (string) .N ThreadSafeNoUpdate .N Fortran .N Errors .N MPI_SUCCESS .N MPI_ERR_INFO .N MPI_ERR_ARG .N MPI_ERR_OTHER @*/ int MPI_Unpublish_name(const char *service_name, MPI_Info info, const char *port_name) { static const char FCNAME[] = "MPI_Unpublish_name"; int mpi_errno = MPI_SUCCESS; MPID_Info *info_ptr = NULL; MPID_MPI_STATE_DECL(MPID_STATE_MPI_UNPUBLISH_NAME); MPIR_ERRTEST_INITIALIZED_ORDIE(); MPID_THREAD_CS_ENTER(GLOBAL, MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX); MPID_MPI_FUNC_ENTER(MPID_STATE_MPI_UNPUBLISH_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 /* Convert MPI object handles to object pointers */ MPID_Info_get_ptr( info, info_ptr ); /* Validate parameters and objects (post conversion) */ # ifdef HAVE_ERROR_CHECKING { MPID_BEGIN_ERROR_CHECKS; { /* Validate info_ptr (only if not null) */ if (info_ptr) MPID_Info_valid_ptr( info_ptr, mpi_errno ); 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 { /* The standard leaves explicitly undefined what happens if the code attempts to unpublish a name that is not published. In this case, MPI_Unpublish_name could be called before a name service structure is allocated. */ 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_Unpublish( MPIR_Namepub, info_ptr, (const char *)service_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: MPID_MPI_FUNC_EXIT(MPID_STATE_MPI_UNPUBLISH_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_unpublish_name", "**mpi_unpublish_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-- */ }
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; }