interface to post a callback for notification of change to modex data
This commit was SVN r9753.
Этот коммит содержится в:
родитель
4fd2a71b6c
Коммит
02d991532f
@ -40,6 +40,23 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
struct mca_pml_base_modex_cb_t {
|
||||||
|
opal_list_item_t super;
|
||||||
|
mca_base_component_t* component;
|
||||||
|
mca_pml_base_modex_cb_fn_t cbfunc;
|
||||||
|
void* cbdata;
|
||||||
|
};
|
||||||
|
typedef struct mca_pml_base_modex_cb_t mca_pml_base_modex_cb_t;
|
||||||
|
|
||||||
|
|
||||||
|
OBJ_CLASS_INSTANCE(
|
||||||
|
mca_pml_base_modex_cb_t,
|
||||||
|
opal_list_item_t,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mca_pml_base_modex_module_t
|
* mca_pml_base_modex_module_t
|
||||||
*
|
*
|
||||||
@ -52,13 +69,16 @@ struct mca_pml_base_modex_module_t {
|
|||||||
void *module_data;
|
void *module_data;
|
||||||
size_t module_data_size;
|
size_t module_data_size;
|
||||||
bool module_data_avail;
|
bool module_data_avail;
|
||||||
|
opal_list_t module_cbs;
|
||||||
opal_condition_t module_data_cond;
|
opal_condition_t module_data_cond;
|
||||||
};
|
};
|
||||||
typedef struct mca_pml_base_modex_module_t mca_pml_base_modex_module_t;
|
typedef struct mca_pml_base_modex_module_t mca_pml_base_modex_module_t;
|
||||||
|
|
||||||
|
|
||||||
static void mca_pml_base_modex_module_construct(mca_pml_base_modex_module_t *module)
|
static void mca_pml_base_modex_module_construct(mca_pml_base_modex_module_t *module)
|
||||||
{
|
{
|
||||||
OBJ_CONSTRUCT(&module->module_data_cond, opal_condition_t);
|
OBJ_CONSTRUCT(&module->module_data_cond, opal_condition_t);
|
||||||
|
OBJ_CONSTRUCT(&module->module_cbs, opal_list_t);
|
||||||
memset(&module->component, 0, sizeof(module->component));
|
memset(&module->component, 0, sizeof(module->component));
|
||||||
module->module_data = NULL;
|
module->module_data = NULL;
|
||||||
module->module_data_size = 0;
|
module->module_data_size = 0;
|
||||||
@ -270,11 +290,13 @@ static void mca_pml_base_modex_registry_callback(
|
|||||||
keyval = value->keyvals;
|
keyval = value->keyvals;
|
||||||
for (j=0; j < value->cnt; j++) {
|
for (j=0; j < value->cnt; j++) {
|
||||||
orte_buffer_t buffer;
|
orte_buffer_t buffer;
|
||||||
|
opal_list_item_t* item;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
void* bytes = NULL;
|
void* bytes = NULL;
|
||||||
size_t cnt;
|
size_t cnt;
|
||||||
size_t num_bytes;
|
size_t num_bytes;
|
||||||
orte_byte_object_t *bo;
|
orte_byte_object_t *bo;
|
||||||
|
|
||||||
if(strcmp(keyval[j]->key,OMPI_MODEX_KEY) != 0)
|
if(strcmp(keyval[j]->key,OMPI_MODEX_KEY) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -347,16 +369,15 @@ static void mca_pml_base_modex_registry_callback(
|
|||||||
modex_module->module_data = bytes;
|
modex_module->module_data = bytes;
|
||||||
modex_module->module_data_size = num_bytes;
|
modex_module->module_data_size = num_bytes;
|
||||||
modex_module->module_data_avail = true;
|
modex_module->module_data_avail = true;
|
||||||
#if 0
|
|
||||||
opal_output(0, "[%lu,%lu,%lu] mca_pml_base_modex_registry_callback: %s-%s-%d-%d received %d bytes\n",
|
|
||||||
ORTE_NAME_ARGS(orte_process_info.my_name),
|
|
||||||
component.mca_type_name,
|
|
||||||
component.mca_component_name,
|
|
||||||
component.mca_component_major_version,
|
|
||||||
component.mca_component_minor_version,
|
|
||||||
num_bytes);
|
|
||||||
#endif
|
|
||||||
opal_condition_signal(&modex_module->module_data_cond);
|
opal_condition_signal(&modex_module->module_data_cond);
|
||||||
|
|
||||||
|
/* call any registered callbacks */
|
||||||
|
for(item = opal_list_get_first(&modex_module->module_cbs);
|
||||||
|
item != opal_list_get_end(&modex_module->module_cbs);
|
||||||
|
item = opal_list_get_next(item)) {
|
||||||
|
mca_pml_base_modex_cb_t* cb = (mca_pml_base_modex_cb_t*)item;
|
||||||
|
cb->cbfunc(cb->component, proc, bytes, num_bytes, cb->cbdata);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
OPAL_THREAD_UNLOCK(&proc->proc_lock);
|
OPAL_THREAD_UNLOCK(&proc->proc_lock);
|
||||||
} /* convert string to process name */
|
} /* convert string to process name */
|
||||||
@ -514,22 +535,6 @@ int mca_pml_base_modex_send(
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
value.byteobject.size = size;
|
|
||||||
value.byteobject.bytes = (void *)malloc(size);
|
|
||||||
if(NULL == value.byteobject.bytes) {
|
|
||||||
ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE);
|
|
||||||
return OMPI_ERR_OUT_OF_RESOURCE;
|
|
||||||
}
|
|
||||||
memcpy((value.byteobject.bytes, data, size));
|
|
||||||
|
|
||||||
asprintf(&((value->keyvals[0])->key), "modex-%s-%s-%d-%d",
|
|
||||||
source_component->mca_type_name,
|
|
||||||
source_component->mca_component_name,
|
|
||||||
source_component->mca_component_major_version,
|
|
||||||
source_component->mca_component_minor_version);
|
|
||||||
#else
|
|
||||||
OBJ_CONSTRUCT(&buffer, orte_buffer_t);
|
OBJ_CONSTRUCT(&buffer, orte_buffer_t);
|
||||||
ptr = source_component->mca_type_name;
|
ptr = source_component->mca_type_name;
|
||||||
if (ORTE_SUCCESS != (rc = orte_dss.pack(&buffer, &ptr, 1, ORTE_STRING))) {
|
if (ORTE_SUCCESS != (rc = orte_dss.pack(&buffer, &ptr, 1, ORTE_STRING))) {
|
||||||
@ -571,7 +576,6 @@ int mca_pml_base_modex_send(
|
|||||||
ORTE_ERROR_LOG(rc);
|
ORTE_ERROR_LOG(rc);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
rc = orte_gpr.put_1(ORTE_GPR_TOKENS_AND | ORTE_GPR_KEYS_OR,
|
rc = orte_gpr.put_1(ORTE_GPR_TOKENS_AND | ORTE_GPR_KEYS_OR,
|
||||||
segment, tokens, OMPI_MODEX_KEY, &value);
|
segment, tokens, OMPI_MODEX_KEY, &value);
|
||||||
@ -625,14 +629,6 @@ int mca_pml_base_modex_recv(
|
|||||||
|
|
||||||
/* wait until data is available */
|
/* wait until data is available */
|
||||||
while(modex_module->module_data_avail == false) {
|
while(modex_module->module_data_avail == false) {
|
||||||
#if 0
|
|
||||||
opal_output(0, "[%lu,%lu,%lu] mca_pml_base_modex_registry_callback: waiting for %s-%s-%d-%d\n",
|
|
||||||
ORTE_NAME_ARGS(orte_process_info.my_name),
|
|
||||||
component->mca_type_name,
|
|
||||||
component->mca_component_name,
|
|
||||||
component->mca_component_major_version,
|
|
||||||
component->mca_component_minor_version);
|
|
||||||
#endif
|
|
||||||
opal_condition_wait(&modex_module->module_data_cond, &proc->proc_lock);
|
opal_condition_wait(&modex_module->module_data_cond, &proc->proc_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -654,6 +650,53 @@ opal_output(0, "[%lu,%lu,%lu] mca_pml_base_modex_registry_callback: waiting for
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
int mca_pml_base_modex_recv_nb(
|
||||||
|
mca_base_component_t *component,
|
||||||
|
ompi_proc_t *proc,
|
||||||
|
mca_pml_base_modex_cb_fn_t cbfunc,
|
||||||
|
void *cbdata)
|
||||||
|
{
|
||||||
|
mca_pml_base_modex_t* modex;
|
||||||
|
mca_pml_base_modex_module_t* module;
|
||||||
|
mca_pml_base_modex_cb_t* cb;
|
||||||
|
|
||||||
|
/* check the proc for existing modex */
|
||||||
|
OPAL_THREAD_LOCK(&proc->proc_lock);
|
||||||
|
if(NULL == (modex = (mca_pml_base_modex_t*)proc->proc_modex)) {
|
||||||
|
modex = OBJ_NEW(mca_pml_base_modex_t);
|
||||||
|
if(modex == NULL) {
|
||||||
|
OPAL_THREAD_UNLOCK(&proc->proc_lock);
|
||||||
|
return OMPI_ERR_OUT_OF_RESOURCE;
|
||||||
|
}
|
||||||
|
proc->proc_modex = &modex->super;
|
||||||
|
|
||||||
|
/* verify that we have subscribed to this segment */
|
||||||
|
OPAL_THREAD_UNLOCK(&proc->proc_lock);
|
||||||
|
mca_pml_base_modex_subscribe(&proc->proc_name);
|
||||||
|
OPAL_THREAD_LOCK(&proc->proc_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lookup/create the module */
|
||||||
|
if(NULL == (module = mca_pml_base_modex_create_module(modex, component))) {
|
||||||
|
OPAL_THREAD_UNLOCK(&proc->proc_lock);
|
||||||
|
return OMPI_ERR_OUT_OF_RESOURCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* register the callback */
|
||||||
|
cb = OBJ_NEW(mca_pml_base_modex_cb_t);
|
||||||
|
cb->component = component;
|
||||||
|
cb->cbfunc = cbfunc;
|
||||||
|
cb->cbdata = cbdata;
|
||||||
|
opal_list_append(&module->module_cbs, (opal_list_item_t*)cb);
|
||||||
|
OPAL_THREAD_UNLOCK(&proc->proc_lock);
|
||||||
|
return OMPI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Subscribe to the segment corresponding
|
* Subscribe to the segment corresponding
|
||||||
* to this job.
|
* to this job.
|
||||||
@ -663,3 +706,4 @@ int mca_pml_base_modex_exchange(void)
|
|||||||
{
|
{
|
||||||
return mca_pml_base_modex_subscribe(orte_process_info.my_name);
|
return mca_pml_base_modex_subscribe(orte_process_info.my_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,6 +128,39 @@ OMPI_DECLSPEC int mca_pml_base_modex_recv(mca_base_component_t *dest_component,
|
|||||||
struct ompi_proc_t *source_proc,
|
struct ompi_proc_t *source_proc,
|
||||||
void **buffer, size_t *size);
|
void **buffer, size_t *size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register to receive a callback on change to module specific data.
|
||||||
|
*
|
||||||
|
* @param dest_component A pointer to this module's component struct
|
||||||
|
* (i.e., mca_base_component_t instance).
|
||||||
|
* @param source_proc Peer process to receive from.
|
||||||
|
* @param buffer A pointer to a (void*) that will be filled with a
|
||||||
|
* pointer to the received buffer.
|
||||||
|
* @param size Pointer to a size_t that will be filled with the
|
||||||
|
* number of bytes of each instance in the buffer.
|
||||||
|
* @param count Pointer to an int that will be filled with the
|
||||||
|
* number of instances in the buffer.
|
||||||
|
*
|
||||||
|
* @retval OMPI_SUCCESS If a corresponding module buffer is found and
|
||||||
|
* is successfully returned to the caller.
|
||||||
|
* @retval OMPI_ERR_OUT_OF_RESOURCE If no corresponding module buffer is found,
|
||||||
|
* or if an error occurs wil returning the buffer to the caller.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef void (*mca_pml_base_modex_cb_fn_t)(
|
||||||
|
mca_base_component_t *component,
|
||||||
|
struct ompi_proc_t* proc,
|
||||||
|
void* buffer,
|
||||||
|
size_t size,
|
||||||
|
void* cbdata);
|
||||||
|
|
||||||
|
OMPI_DECLSPEC int mca_pml_base_modex_recv_nb(
|
||||||
|
mca_base_component_t *component,
|
||||||
|
struct ompi_proc_t* proc,
|
||||||
|
mca_pml_base_modex_cb_fn_t cbfunc,
|
||||||
|
void* cbdata);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called to subscribe to registry.
|
* Called to subscribe to registry.
|
||||||
*/
|
*/
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user