X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=plugins%2Fctf%2Fcommon%2Fmetadata%2Fvisitor-generate-ir.c;h=2e175e75d7d967cb2ef66cdbef69380bcc4d43e7;hb=c3c30b08de95f06de6ad2f12001bede5da3f7674;hp=6fcf57540874e4c94659b0bb8814eaa0abe01c39;hpb=835b2d10c5c80ebad6427ba3794d712dd44ef145;p=babeltrace.git diff --git a/plugins/ctf/common/metadata/visitor-generate-ir.c b/plugins/ctf/common/metadata/visitor-generate-ir.c index 6fcf5754..2e175e75 100644 --- a/plugins/ctf/common/metadata/visitor-generate-ir.c +++ b/plugins/ctf/common/metadata/visitor-generate-ir.c @@ -120,6 +120,25 @@ enum { _EVENT_FIELDS_SET = _BV(6), }; +enum loglevel { + LOGLEVEL_EMERG = 0, + LOGLEVEL_ALERT = 1, + LOGLEVEL_CRIT = 2, + LOGLEVEL_ERR = 3, + LOGLEVEL_WARNING = 4, + LOGLEVEL_NOTICE = 5, + LOGLEVEL_INFO = 6, + LOGLEVEL_DEBUG_SYSTEM = 7, + LOGLEVEL_DEBUG_PROGRAM = 8, + LOGLEVEL_DEBUG_PROCESS = 9, + LOGLEVEL_DEBUG_MODULE = 10, + LOGLEVEL_DEBUG_UNIT = 11, + LOGLEVEL_DEBUG_FUNCTION = 12, + LOGLEVEL_DEBUG_LINE = 13, + LOGLEVEL_DEBUG = 14, + _NR_LOGLEVELS = 15, +}; + /* Prefixes of type aliases */ #define _PREFIX_ALIAS 'a' #define _PREFIX_ENUM 'e' @@ -210,6 +229,37 @@ struct ctx { GHashTable *stream_classes; }; +static +const char *loglevel_str [] = { + [ LOGLEVEL_EMERG ] = "TRACE_EMERG", + [ LOGLEVEL_ALERT ] = "TRACE_ALERT", + [ LOGLEVEL_CRIT ] = "TRACE_CRIT", + [ LOGLEVEL_ERR ] = "TRACE_ERR", + [ LOGLEVEL_WARNING ] = "TRACE_WARNING", + [ LOGLEVEL_NOTICE ] = "TRACE_NOTICE", + [ LOGLEVEL_INFO ] = "TRACE_INFO", + [ LOGLEVEL_DEBUG_SYSTEM ] = "TRACE_DEBUG_SYSTEM", + [ LOGLEVEL_DEBUG_PROGRAM ] = "TRACE_DEBUG_PROGRAM", + [ LOGLEVEL_DEBUG_PROCESS ] = "TRACE_DEBUG_PROCESS", + [ LOGLEVEL_DEBUG_MODULE ] = "TRACE_DEBUG_MODULE", + [ LOGLEVEL_DEBUG_UNIT ] = "TRACE_DEBUG_UNIT", + [ LOGLEVEL_DEBUG_FUNCTION ] = "TRACE_DEBUG_FUNCTION", + [ LOGLEVEL_DEBUG_LINE ] = "TRACE_DEBUG_LINE", + [ LOGLEVEL_DEBUG ] = "TRACE_DEBUG", +}; + +static +const char *print_loglevel(int64_t value) +{ + if (value < 0) { + return NULL; + } + if (value >= _NR_LOGLEVELS) { + return "<>"; + } + return loglevel_str[value]; +} + /** * Creates a new declaration scope. * @@ -3047,7 +3097,9 @@ int visit_event_decl_entry(struct ctx *ctx, struct ctf_node *node, _SET(set, _EVENT_FIELDS_SET); } else if (!strcmp(left, "loglevel")) { - uint64_t loglevel; + uint64_t loglevel_value; + const char *loglevel_str; + struct bt_value *value_obj, *str_obj; if (_IS_SET(set, _EVENT_LOGLEVEL_SET)) { _PERROR_DUP_ATTR("loglevel", @@ -3057,15 +3109,38 @@ int visit_event_decl_entry(struct ctx *ctx, struct ctf_node *node, } ret = get_unary_unsigned(&node->u.ctf_expression.right, - &loglevel); + &loglevel_value); if (ret) { _PERROR("%s", "unexpected unary expression for event declaration's \"loglevel\" attribute"); ret = -EINVAL; goto error; } - - // TODO: FIXME: set log level here - + value_obj = bt_value_integer_create_init(loglevel_value); + if (!value_obj) { + _PERROR("%s", "cannot allocate memory for loglevel value object"); + ret = -ENOMEM; + goto error; + } + if (bt_ctf_event_class_set_attribute(event_class, + "loglevel", value_obj) != BT_VALUE_STATUS_OK) { + _PERROR("%s", "cannot set loglevel value"); + ret = -EINVAL; + bt_put(value_obj); + goto error; + } + loglevel_str = print_loglevel(loglevel_value); + if (loglevel_str) { + str_obj = bt_value_string_create_init(loglevel_str); + if (bt_ctf_event_class_set_attribute(event_class, + "loglevel_string", str_obj) != BT_VALUE_STATUS_OK) { + _PERROR("%s", "cannot set loglevel string"); + ret = -EINVAL; + bt_put(str_obj); + goto error; + } + bt_put(str_obj); + } + bt_put(value_obj); _SET(set, _EVENT_LOGLEVEL_SET); } else if (!strcmp(left, "model.emf.uri")) { char *right;