diff --git a/include/margo.h b/include/margo.h index 472574df474e08351462244b2fea666ddef353cd..cbb9e3e0e01a755481d33b3dbb4dc210244d1aea 100644 --- a/include/margo.h +++ b/include/margo.h @@ -174,6 +174,24 @@ hg_return_t margo_registered_name( hg_id_t *id, hg_bool_t *flag); +/** + * Indicate whether the given RPC name has been registered with the given multiplex id. + * + * @param [in] mid Margo instance + * @param [in] func_name function name + * @param [in] mplex_id multiplex id + * @param [out] id registered RPC ID + * @param [out] flag pointer to boolean + * + * @return HG_SUCCESS or corresponding HG error code + */ +hg_return_t margo_registered_name_mplex( + margo_instance_id mid, + const char *func_name, + uint32_t mplex_id, + hg_id_t *id, + hg_bool_t *flag); + /** * Register and associate user data to registered function. * When HG_Finalize() is called free_callback (if defined) is called diff --git a/src/margo.c b/src/margo.c index 1b6c64f1ba2db8c8b307c16af07912f62e66df6a..a25bde3d5a4bc04f01cc74984e7d73c7be9e721c 100644 --- a/src/margo.c +++ b/src/margo.c @@ -507,6 +507,37 @@ hg_return_t margo_registered_name(margo_instance_id mid, const char *func_name, return(HG_Registered_name(mid->hg_class, func_name, id, flag)); } +hg_return_t margo_registered_name_mplex(margo_instance_id mid, const char *func_name, + uint32_t mplex_id, hg_id_t *id, hg_bool_t *flag) +{ + hg_bool_t b; + hg_return_t ret = margo_registered_name(mid, func_name, id, &b); + if(ret != HG_SUCCESS) + return ret; + if((!b) || (!mplex_id)) { + *flag = b; + return ret; + } + + struct mplex_key key; + struct mplex_element *element; + + memset(&key, 0, sizeof(key)); + key.id = *id; + key.mplex_id = mplex_id; + + HASH_FIND(hh, mid->mplex_table, &key, sizeof(key), element); + if(!element) { + *flag = 0; + return HG_SUCCESS; + } + + assert(element->key.id == *id && element->key.mplex_id == mplex_id); + + *flag = 1; + return HG_SUCCESS; +} + hg_return_t margo_register_data( margo_instance_id mid, hg_id_t id,