1
1
openmpi/orte/mca/notifier/base/notifier_base_fns.c
2015-06-23 20:59:57 -07:00

194 строки
7.0 KiB
C

/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2008-2015 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "orte_config.h"
#include "orte/constants.h"
#include "opal/util/argv.h"
#include "orte/util/attr.h"
#include "orte/mca/notifier/base/base.h"
static void orte_notifier_base_identify_modules(char ***modules,
orte_notifier_request_t *req);
void orte_notifier_base_log(int sd, short args, void *cbdata)
{
orte_notifier_request_t *req = (orte_notifier_request_t*)cbdata;
char **modules = NULL;
orte_notifier_active_module_t *imod;
int i;
/* if no modules are active, then there is nothing to do */
if (0 == opal_list_get_size(&orte_notifier_base.modules)) {
return;
}
/* check if the severity is >= severity level set for
* reporting - note that the severity enum value goes up
* as severity goes down */
if (orte_notifier_base.severity_level < req->severity ) {
return;
}
orte_notifier_base_identify_modules(&modules, req);
/* no modules selected then nothing to do */
if (NULL == modules) {
return;
}
for (i=0; NULL != modules[i]; i++) {
OPAL_LIST_FOREACH(imod, &orte_notifier_base.modules, orte_notifier_active_module_t) {
if (NULL != imod->module->log &&
0 == strcmp(imod->component->base_version.mca_component_name, modules[i]))
imod->module->log(req);
}
}
opal_argv_free(modules);
}
void orte_notifier_base_event(int sd, short args, void *cbdata)
{
orte_notifier_request_t *req = (orte_notifier_request_t*)cbdata;
char **modules = NULL;
orte_notifier_active_module_t *imod;
int i;
/* if no modules are active, then there is nothing to do */
if (0 == opal_list_get_size(&orte_notifier_base.modules)) {
return;
}
/* check if the severity is >= severity level set for
* reporting - note that the severity enum value goes up
* as severity goes down */
if (orte_notifier_base.severity_level < req->severity ) {
return;
}
orte_notifier_base_identify_modules(&modules, req);
/* no modules selected then nothing to do */
if (NULL == modules) {
return;
}
for (i=0; NULL != modules[i]; i++) {
OPAL_LIST_FOREACH(imod, &orte_notifier_base.modules, orte_notifier_active_module_t) {
if (NULL != imod->module->log &&
0 == strcmp(imod->component->base_version.mca_component_name, modules[i]))
imod->module->event(req);
}
}
opal_argv_free(modules);
}
void orte_notifier_base_report(int sd, short args, void *cbdata)
{
orte_notifier_request_t *req = (orte_notifier_request_t*)cbdata;
char **modules = NULL;
orte_notifier_active_module_t *imod;
int i;
/* if no modules are active, then there is nothing to do */
if (0 == opal_list_get_size(&orte_notifier_base.modules)) {
return;
}
/* see if the job requested any notifications */
if (!orte_get_attribute(&req->jdata->attributes, ORTE_JOB_NOTIFICATIONS, (void**)modules, OPAL_STRING)) {
return;
}
/* need to process the notification string to get the names of the modules */
if (NULL == modules) {
orte_notifier_base_identify_modules(&modules, req);
/* no modules selected then nothing to do */
if (NULL == modules) {
return;
}
}
for (i=0; NULL != modules[i]; i++) {
OPAL_LIST_FOREACH(imod, &orte_notifier_base.modules, orte_notifier_active_module_t) {
if (NULL != imod->module->log &&
0 == strcmp(imod->component->base_version.mca_component_name, modules[i]))
imod->module->report(req);
}
}
opal_argv_free(modules);
}
const char* orte_notifier_base_sev2str(orte_notifier_severity_t severity)
{
switch (severity) {
case ORTE_NOTIFIER_EMERG: return "EMERGENCY"; break;
case ORTE_NOTIFIER_ALERT: return "ALERT"; break;
case ORTE_NOTIFIER_CRIT: return "CRITICAL"; break;
case ORTE_NOTIFIER_ERROR: return "ERROR"; break;
case ORTE_NOTIFIER_WARN: return "WARNING"; break;
case ORTE_NOTIFIER_NOTICE: return "NOTICE"; break;
case ORTE_NOTIFIER_INFO: return "INFO"; break;
case ORTE_NOTIFIER_DEBUG: return "DEBUG"; break;
default: return "UNKNOWN"; break;
}
}
static void orte_notifier_base_identify_modules(char ***modules,
orte_notifier_request_t *req)
{
if (NULL != req->action) {
*modules = opal_argv_split(req->action, ',');
} else {
if (ORTE_NOTIFIER_EMERG == req->severity &&
(NULL != orte_notifier_base.emerg_actions)) {
*modules = opal_argv_split(orte_notifier_base.emerg_actions, ',');
} else if (ORTE_NOTIFIER_ALERT == req->severity &&
(NULL != orte_notifier_base.alert_actions)) {
*modules = opal_argv_split(orte_notifier_base.alert_actions, ',');
} else if (ORTE_NOTIFIER_CRIT == req->severity &&
(NULL != orte_notifier_base.crit_actions)) {
*modules = opal_argv_split(orte_notifier_base.crit_actions, ',');
} else if (ORTE_NOTIFIER_WARN == req->severity &&
(NULL != orte_notifier_base.warn_actions)) {
*modules = opal_argv_split(orte_notifier_base.warn_actions, ',');
} else if (ORTE_NOTIFIER_NOTICE == req->severity &&
(NULL != orte_notifier_base.notice_actions)) {
*modules = opal_argv_split(orte_notifier_base.notice_actions, ',');
} else if (ORTE_NOTIFIER_INFO == req->severity &&
(NULL != orte_notifier_base.info_actions)) {
*modules = opal_argv_split(orte_notifier_base.info_actions, ',');
} else if (ORTE_NOTIFIER_DEBUG == req->severity &&
(NULL != orte_notifier_base.debug_actions)) {
*modules = opal_argv_split(orte_notifier_base.debug_actions, ',');
} else if (ORTE_NOTIFIER_ERROR == req->severity &&
(NULL != orte_notifier_base.error_actions)) {
*modules = opal_argv_split(orte_notifier_base.error_actions, ',');
} else if (NULL != orte_notifier_base.default_actions) {
*modules = opal_argv_split(orte_notifier_base.default_actions, ',');
}
}
return;
}