X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Fctf%2Fcommon%2Fbfcr%2Fbfcr.c;h=eba591c71bcdd30ce91146962a38e26163e29ec3;hb=00dff0ec100dfdf9769819da6a5f5d29f464dede;hp=2bdd961ddc393cc126408bce54e47526635150d7;hpb=578e048b5debf169e286e5b5cc747b5d6c16886d;p=babeltrace.git diff --git a/src/plugins/ctf/common/bfcr/bfcr.c b/src/plugins/ctf/common/bfcr/bfcr.c index 2bdd961d..eba591c7 100644 --- a/src/plugins/ctf/common/bfcr/bfcr.c +++ b/src/plugins/ctf/common/bfcr/bfcr.c @@ -1,30 +1,16 @@ /* - * Babeltrace - CTF binary field class reader (BFCR) + * SPDX-License-Identifier: MIT * * Copyright (c) 2015-2016 EfficiOS Inc. and Linux Foundation * Copyright (c) 2015-2016 Philippe Proulx * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Babeltrace - CTF binary field class reader (BFCR) */ -#define BT_LOG_TAG "PLUGIN-CTF-BFCR" -#include "logging.h" +#define BT_COMP_LOG_SELF_COMP (bfcr->self_comp) +#define BT_LOG_OUTPUT_LEVEL (bfcr->log_level) +#define BT_LOG_TAG "PLUGIN/CTF/BFCR" +#include "logging/comp-logging.h" #include #include @@ -68,8 +54,12 @@ struct stack_entry { int64_t index; }; +struct bt_bfcr; + /* Visit stack */ struct stack { + struct bt_bfcr *bfcr; + /* Entries (struct stack_entry) */ GArray *entries; @@ -89,7 +79,12 @@ enum bfcr_state { /* Binary class reader */ struct bt_bfcr { - /* Bisit stack */ + bt_logging_level log_level; + + /* Weak */ + bt_self_component *self_comp; + + /* BFCR stack */ struct stack *stack; /* Current basic field class */ @@ -105,8 +100,8 @@ struct bt_bfcr { * classes for which the common boundary is not the boundary of * a byte cannot have different byte orders. * - * This is set to -1 on reset and when the last basic field class - * was a string class. + * This is set to CTF_BYTE_ORDER_UNKNOWN on reset and when the last + * basic field class was a string class. */ enum ctf_byte_order last_bo; @@ -161,40 +156,41 @@ const char *bfcr_state_string(enum bfcr_state state) { switch (state) { case BFCR_STATE_NEXT_FIELD: - return "BFCR_STATE_NEXT_FIELD"; + return "NEXT_FIELD"; case BFCR_STATE_ALIGN_BASIC: - return "BFCR_STATE_ALIGN_BASIC"; + return "ALIGN_BASIC"; case BFCR_STATE_ALIGN_COMPOUND: - return "BFCR_STATE_ALIGN_COMPOUND"; + return "ALIGN_COMPOUND"; case BFCR_STATE_READ_BASIC_BEGIN: - return "BFCR_STATE_READ_BASIC_BEGIN"; + return "READ_BASIC_BEGIN"; case BFCR_STATE_READ_BASIC_CONTINUE: - return "BFCR_STATE_READ_BASIC_CONTINUE"; + return "READ_BASIC_CONTINUE"; case BFCR_STATE_DONE: - return "BFCR_STATE_DONE"; - default: - return "(unknown)"; + return "DONE"; } + + bt_common_abort(); } static -struct stack *stack_new(void) +struct stack *stack_new(struct bt_bfcr *bfcr) { struct stack *stack = NULL; stack = g_new0(struct stack, 1); if (!stack) { - BT_LOGE_STR("Failed to allocate one stack."); + BT_COMP_LOGE_STR("Failed to allocate one stack."); goto error; } + stack->bfcr = bfcr; stack->entries = g_array_new(FALSE, TRUE, sizeof(struct stack_entry)); if (!stack->entries) { - BT_LOGE_STR("Failed to allocate a GArray."); + BT_COMP_LOGE_STR("Failed to allocate a GArray."); goto error; } - BT_LOGD("Created stack: addr=%p", stack); + BT_COMP_LOGD("Created stack: addr=%p", stack); return stack; error: @@ -205,11 +201,14 @@ error: static void stack_destroy(struct stack *stack) { + struct bt_bfcr *bfcr; + if (!stack) { return; } - BT_LOGD("Destroying stack: addr=%p", stack); + bfcr = stack->bfcr; + BT_COMP_LOGD("Destroying stack: addr=%p", stack); if (stack->entries) { g_array_free(stack->entries, TRUE); @@ -223,10 +222,12 @@ int stack_push(struct stack *stack, struct ctf_field_class *base_class, size_t base_len) { struct stack_entry *entry; + struct bt_bfcr *bfcr; - BT_ASSERT(stack); - BT_ASSERT(base_class); - BT_LOGV("Pushing field class on stack: stack-addr=%p, " + BT_ASSERT_DBG(stack); + BT_ASSERT_DBG(base_class); + bfcr = stack->bfcr; + BT_COMP_LOGT("Pushing field class on stack: stack-addr=%p, " "fc-addr=%p, fc-type=%d, base-length=%zu, " "stack-size-before=%zu, stack-size-after=%zu", stack, base_class, base_class->type, @@ -276,7 +277,7 @@ int64_t get_compound_field_class_length(struct bt_bfcr *bfcr, bfcr->user.data); break; default: - abort(); + bt_common_abort(); } return length; @@ -289,7 +290,7 @@ int stack_push_with_len(struct bt_bfcr *bfcr, struct ctf_field_class *base_class int64_t length = get_compound_field_class_length(bfcr, base_class); if (length < 0) { - BT_LOGW("Cannot get compound field class's field count: " + BT_COMP_LOGW("Cannot get compound field class's field count: " "bfcr-addr=%p, fc-addr=%p, fc-type=%d", bfcr, base_class, base_class->type); ret = BT_BFCR_STATUS_ERROR; @@ -305,16 +306,19 @@ end: static inline unsigned int stack_size(struct stack *stack) { - BT_ASSERT(stack); + BT_ASSERT_DBG(stack); return stack->size; } static void stack_pop(struct stack *stack) { - BT_ASSERT(stack); - BT_ASSERT(stack_size(stack)); - BT_LOGV("Popping from stack: " + struct bt_bfcr *bfcr; + + BT_ASSERT_DBG(stack); + BT_ASSERT_DBG(stack_size(stack)); + bfcr = stack->bfcr; + BT_COMP_LOGT("Popping from stack: " "stack-addr=%p, stack-size-before=%u, stack-size-after=%u", stack, stack->entries->len, stack->entries->len - 1); stack->size--; @@ -329,15 +333,15 @@ bool stack_empty(struct stack *stack) static void stack_clear(struct stack *stack) { - BT_ASSERT(stack); + BT_ASSERT_DBG(stack); stack->size = 0; } static inline struct stack_entry *stack_top(struct stack *stack) { - BT_ASSERT(stack); - BT_ASSERT(stack_size(stack)); + BT_ASSERT_DBG(stack); + BT_ASSERT_DBG(stack_size(stack)); return &g_array_index(stack->entries, struct stack_entry, stack->size - 1); } @@ -351,7 +355,7 @@ size_t available_bits(struct bt_bfcr *bfcr) static inline void consume_bits(struct bt_bfcr *bfcr, size_t incr) { - BT_LOGV("Advancing cursor: bfcr-addr=%p, cur-before=%zu, cur-after=%zu", + BT_COMP_LOGT("Advancing cursor: bfcr-addr=%p, cur-before=%zu, cur-after=%zu", bfcr, bfcr->buf.at, bfcr->buf.at + incr); bfcr->buf.at += incr; } @@ -444,7 +448,7 @@ void stitch_set_from_remaining_buf(struct bt_bfcr *bfcr) } static inline -void read_unsigned_bitfield(const uint8_t *buf, size_t at, +void read_unsigned_bitfield(struct bt_bfcr *bfcr, const uint8_t *buf, size_t at, unsigned int field_size, enum ctf_byte_order bo, uint64_t *v) { @@ -456,15 +460,15 @@ void read_unsigned_bitfield(const uint8_t *buf, size_t at, bt_bitfield_read_le(buf, uint8_t, at, field_size, v); break; default: - abort(); + bt_common_abort(); } - BT_LOGV("Read unsigned bit array: cur=%zu, size=%u, " + BT_COMP_LOGT("Read unsigned bit array: cur=%zu, size=%u, " "bo=%d, val=%" PRIu64, at, field_size, bo, *v); } static inline -void read_signed_bitfield(const uint8_t *buf, size_t at, +void read_signed_bitfield(struct bt_bfcr *bfcr, const uint8_t *buf, size_t at, unsigned int field_size, enum ctf_byte_order bo, int64_t *v) { switch (bo) { @@ -475,10 +479,10 @@ void read_signed_bitfield(const uint8_t *buf, size_t at, bt_bitfield_read_le(buf, uint8_t, at, field_size, v); break; default: - abort(); + bt_common_abort(); } - BT_LOGV("Read signed bit array: cur=%zu, size=%u, " + BT_COMP_LOGT("Read signed bit array: cur=%zu, size=%u, " "bo=%d, val=%" PRId64, at, field_size, bo, *v); } @@ -497,12 +501,12 @@ enum bt_bfcr_status validate_contiguous_bo(struct bt_bfcr *bfcr, } /* Always valid if last byte order is unknown */ - if (bfcr->last_bo == -1) { + if (bfcr->last_bo == CTF_BYTE_ORDER_UNKNOWN) { goto end; } /* Always valid if next byte order is unknown */ - if (next_bo == -1) { + if (next_bo == CTF_BYTE_ORDER_UNKNOWN) { goto end; } @@ -524,7 +528,7 @@ enum bt_bfcr_status validate_contiguous_bo(struct bt_bfcr *bfcr, end: if (status < 0) { - BT_LOGW("Cannot read bit array: two different byte orders not at a byte boundary: " + BT_COMP_LOGW("Cannot read bit array: two different byte orders not at a byte boundary: " "bfcr-addr=%p, last-bo=%d, next-bo=%d", bfcr, bfcr->last_bo, next_bo); } @@ -542,7 +546,7 @@ enum bt_bfcr_status read_basic_float_and_call_cb(struct bt_bfcr *bfcr, enum bt_bfcr_status status = BT_BFCR_STATUS_OK; struct ctf_field_class_float *fc = (void *) bfcr->cur_basic_field_class; - BT_ASSERT(fc); + BT_ASSERT_DBG(fc); field_size = fc->base.size; bo = fc->base.byte_order; bfcr->cur_bo = bo; @@ -556,7 +560,7 @@ enum bt_bfcr_status read_basic_float_and_call_cb(struct bt_bfcr *bfcr, float f; } f32; - read_unsigned_bitfield(buf, at, field_size, bo, &v); + read_unsigned_bitfield(bfcr, buf, at, field_size, bo, &v); f32.u = (uint32_t) v; dblval = (double) f32.f; break; @@ -568,26 +572,26 @@ enum bt_bfcr_status read_basic_float_and_call_cb(struct bt_bfcr *bfcr, double d; } f64; - read_unsigned_bitfield(buf, at, field_size, bo, &f64.u); + read_unsigned_bitfield(bfcr, buf, at, field_size, bo, &f64.u); dblval = f64.d; break; } default: /* Only 32-bit and 64-bit fields are supported currently */ - abort(); + bt_common_abort(); } - BT_LOGV("Read floating point number value: bfcr=%p, cur=%zu, val=%f", + BT_COMP_LOGT("Read floating point number value: bfcr=%p, cur=%zu, val=%f", bfcr, at, dblval); if (bfcr->user.cbs.classes.floating_point) { - BT_LOGV("Calling user function (floating point number)."); + BT_COMP_LOGT("Calling user function (floating point number)."); status = bfcr->user.cbs.classes.floating_point(dblval, bfcr->cur_basic_field_class, bfcr->user.data); - BT_LOGV("User function returned: status=%s", + BT_COMP_LOGT("User function returned: status=%s", bt_bfcr_status_string(status)); if (status != BT_BFCR_STATUS_OK) { - BT_LOGW("User function failed: bfcr-addr=%p, status=%s", + BT_COMP_LOGW("User function failed: bfcr-addr=%p, status=%s", bfcr, bt_bfcr_status_string(status)); } } @@ -617,16 +621,16 @@ enum bt_bfcr_status read_basic_int_and_call_cb(struct bt_bfcr *bfcr, if (fc->is_signed) { int64_t v; - read_signed_bitfield(buf, at, field_size, bo, &v); + read_signed_bitfield(bfcr, buf, at, field_size, bo, &v); if (bfcr->user.cbs.classes.signed_int) { - BT_LOGV("Calling user function (signed integer)."); + BT_COMP_LOGT("Calling user function (signed integer)."); status = bfcr->user.cbs.classes.signed_int(v, bfcr->cur_basic_field_class, bfcr->user.data); - BT_LOGV("User function returned: status=%s", + BT_COMP_LOGT("User function returned: status=%s", bt_bfcr_status_string(status)); if (status != BT_BFCR_STATUS_OK) { - BT_LOGW("User function failed: " + BT_COMP_LOGW("User function failed: " "bfcr-addr=%p, status=%s", bfcr, bt_bfcr_status_string(status)); } @@ -634,16 +638,16 @@ enum bt_bfcr_status read_basic_int_and_call_cb(struct bt_bfcr *bfcr, } else { uint64_t v; - read_unsigned_bitfield(buf, at, field_size, bo, &v); + read_unsigned_bitfield(bfcr, buf, at, field_size, bo, &v); if (bfcr->user.cbs.classes.unsigned_int) { - BT_LOGV("Calling user function (unsigned integer)."); + BT_COMP_LOGT("Calling user function (unsigned integer)."); status = bfcr->user.cbs.classes.unsigned_int(v, bfcr->cur_basic_field_class, bfcr->user.data); - BT_LOGV("User function returned: status=%s", + BT_COMP_LOGT("User function returned: status=%s", bt_bfcr_status_string(status)); if (status != BT_BFCR_STATUS_OK) { - BT_LOGW("User function failed: " + BT_COMP_LOGW("User function failed: " "bfcr-addr=%p, status=%s", bfcr, bt_bfcr_status_string(status)); } @@ -664,14 +668,14 @@ enum bt_bfcr_status read_bit_array_class_and_call_continue(struct bt_bfcr *bfcr, (void *) bfcr->cur_basic_field_class; if (!at_least_one_bit_left(bfcr)) { - BT_LOGV("Reached end of data: bfcr-addr=%p", bfcr); + BT_COMP_LOGT("Reached end of data: bfcr-addr=%p", bfcr); status = BT_BFCR_STATUS_EOF; goto end; } available = available_bits(bfcr); needed_bits = fc->size - bfcr->stitch.at; - BT_LOGV("Continuing basic field decoding: " + BT_COMP_LOGT("Continuing basic field decoding: " "bfcr-addr=%p, field-size=%u, needed-size=%zu, " "available-size=%zu", bfcr, fc->size, needed_bits, available); @@ -681,7 +685,7 @@ enum bt_bfcr_status read_bit_array_class_and_call_continue(struct bt_bfcr *bfcr, status = read_basic_and_call_cb(bfcr, bfcr->stitch.buf, bfcr->stitch.offset); if (status != BT_BFCR_STATUS_OK) { - BT_LOGW("Cannot read basic field: " + BT_COMP_LOGW("Cannot read basic field: " "bfcr-addr=%p, fc-addr=%p, status=%s", bfcr, bfcr->cur_basic_field_class, bt_bfcr_status_string(status)); @@ -701,7 +705,7 @@ enum bt_bfcr_status read_bit_array_class_and_call_continue(struct bt_bfcr *bfcr, } /* We are here; it means we don't have enough data to decode this */ - BT_LOGV_STR("Not enough data to read the next basic field: appending to stitch buffer."); + BT_COMP_LOGT_STR("Not enough data to read the next basic field: appending to stitch buffer."); stitch_append_from_remaining_buf(bfcr); status = BT_BFCR_STATUS_EOF; @@ -719,7 +723,7 @@ enum bt_bfcr_status read_bit_array_class_and_call_begin(struct bt_bfcr *bfcr, (void *) bfcr->cur_basic_field_class; if (!at_least_one_bit_left(bfcr)) { - BT_LOGV("Reached end of data: bfcr-addr=%p", bfcr); + BT_COMP_LOGT("Reached end of data: bfcr-addr=%p", bfcr); status = BT_BFCR_STATUS_EOF; goto end; } @@ -734,11 +738,11 @@ enum bt_bfcr_status read_bit_array_class_and_call_begin(struct bt_bfcr *bfcr, if (fc->size <= available) { /* We have all the bits; decode and set now */ - BT_ASSERT(bfcr->buf.addr); + BT_ASSERT_DBG(bfcr->buf.addr); status = read_basic_and_call_cb(bfcr, bfcr->buf.addr, buf_at_from_addr(bfcr)); if (status != BT_BFCR_STATUS_OK) { - BT_LOGW("Cannot read basic field: " + BT_COMP_LOGW("Cannot read basic field: " "bfcr-addr=%p, fc-addr=%p, status=%s", bfcr, bfcr->cur_basic_field_class, bt_bfcr_status_string(status)); @@ -761,7 +765,7 @@ enum bt_bfcr_status read_bit_array_class_and_call_begin(struct bt_bfcr *bfcr, } /* We are here; it means we don't have enough data to decode this */ - BT_LOGV_STR("Not enough data to read the next basic field: setting stitch buffer."); + BT_COMP_LOGT_STR("Not enough data to read the next basic field: setting stitch buffer."); stitch_set_from_remaining_buf(bfcr); bfcr->state = BFCR_STATE_READ_BASIC_CONTINUE; status = BT_BFCR_STATUS_EOF; @@ -812,26 +816,26 @@ enum bt_bfcr_status read_basic_string_class_and_call( enum bt_bfcr_status status = BT_BFCR_STATUS_OK; if (!at_least_one_bit_left(bfcr)) { - BT_LOGV("Reached end of data: bfcr-addr=%p", bfcr); + BT_COMP_LOGT("Reached end of data: bfcr-addr=%p", bfcr); status = BT_BFCR_STATUS_EOF; goto end; } - BT_ASSERT(buf_at_from_addr(bfcr) % 8 == 0); + BT_ASSERT_DBG(buf_at_from_addr(bfcr) % 8 == 0); available_bytes = BITS_TO_BYTES_FLOOR(available_bits(bfcr)); buf_at_bytes = BITS_TO_BYTES_FLOOR(buf_at_from_addr(bfcr)); - BT_ASSERT(bfcr->buf.addr); + BT_ASSERT_DBG(bfcr->buf.addr); first_chr = &bfcr->buf.addr[buf_at_bytes]; result = memchr(first_chr, '\0', available_bytes); if (begin && bfcr->user.cbs.classes.string_begin) { - BT_LOGV("Calling user function (string, beginning)."); + BT_COMP_LOGT("Calling user function (string, beginning)."); status = bfcr->user.cbs.classes.string_begin( bfcr->cur_basic_field_class, bfcr->user.data); - BT_LOGV("User function returned: status=%s", + BT_COMP_LOGT("User function returned: status=%s", bt_bfcr_status_string(status)); if (status != BT_BFCR_STATUS_OK) { - BT_LOGW("User function failed: bfcr-addr=%p, status=%s", + BT_COMP_LOGW("User function failed: bfcr-addr=%p, status=%s", bfcr, bt_bfcr_status_string(status)); goto end; } @@ -840,15 +844,15 @@ enum bt_bfcr_status read_basic_string_class_and_call( if (!result) { /* No null character yet */ if (bfcr->user.cbs.classes.string) { - BT_LOGV("Calling user function (substring)."); + BT_COMP_LOGT("Calling user function (substring)."); status = bfcr->user.cbs.classes.string( (const char *) first_chr, available_bytes, bfcr->cur_basic_field_class, bfcr->user.data); - BT_LOGV("User function returned: status=%s", + BT_COMP_LOGT("User function returned: status=%s", bt_bfcr_status_string(status)); if (status != BT_BFCR_STATUS_OK) { - BT_LOGW("User function failed: " + BT_COMP_LOGW("User function failed: " "bfcr-addr=%p, status=%s", bfcr, bt_bfcr_status_string(status)); goto end; @@ -863,15 +867,15 @@ enum bt_bfcr_status read_basic_string_class_and_call( size_t result_len = (size_t) (result - first_chr); if (bfcr->user.cbs.classes.string && result_len) { - BT_LOGV("Calling user function (substring)."); + BT_COMP_LOGT("Calling user function (substring)."); status = bfcr->user.cbs.classes.string( (const char *) first_chr, result_len, bfcr->cur_basic_field_class, bfcr->user.data); - BT_LOGV("User function returned: status=%s", + BT_COMP_LOGT("User function returned: status=%s", bt_bfcr_status_string(status)); if (status != BT_BFCR_STATUS_OK) { - BT_LOGW("User function failed: " + BT_COMP_LOGW("User function failed: " "bfcr-addr=%p, status=%s", bfcr, bt_bfcr_status_string(status)); goto end; @@ -879,13 +883,13 @@ enum bt_bfcr_status read_basic_string_class_and_call( } if (bfcr->user.cbs.classes.string_end) { - BT_LOGV("Calling user function (string, end)."); + BT_COMP_LOGT("Calling user function (string, end)."); status = bfcr->user.cbs.classes.string_end( bfcr->cur_basic_field_class, bfcr->user.data); - BT_LOGV("User function returned: status=%s", + BT_COMP_LOGT("User function returned: status=%s", bt_bfcr_status_string(status)); if (status != BT_BFCR_STATUS_OK) { - BT_LOGW("User function failed: " + BT_COMP_LOGW("User function failed: " "bfcr-addr=%p, status=%s", bfcr, bt_bfcr_status_string(status)); goto end; @@ -914,7 +918,7 @@ enum bt_bfcr_status read_basic_begin_state(struct bt_bfcr *bfcr) { enum bt_bfcr_status status; - BT_ASSERT(bfcr->cur_basic_field_class); + BT_ASSERT_DBG(bfcr->cur_basic_field_class); switch (bfcr->cur_basic_field_class->type) { case CTF_FIELD_CLASS_TYPE_INT: @@ -928,7 +932,7 @@ enum bt_bfcr_status read_basic_begin_state(struct bt_bfcr *bfcr) status = read_basic_string_class_and_call(bfcr, true); break; default: - abort(); + bt_common_abort(); } return status; @@ -939,7 +943,7 @@ enum bt_bfcr_status read_basic_continue_state(struct bt_bfcr *bfcr) { enum bt_bfcr_status status; - BT_ASSERT(bfcr->cur_basic_field_class); + BT_ASSERT_DBG(bfcr->cur_basic_field_class); switch (bfcr->cur_basic_field_class->type) { case CTF_FIELD_CLASS_TYPE_INT: @@ -953,7 +957,7 @@ enum bt_bfcr_status read_basic_continue_state(struct bt_bfcr *bfcr) status = read_basic_string_class_and_call(bfcr, false); break; default: - abort(); + bt_common_abort(); } return status; @@ -964,7 +968,7 @@ size_t bits_to_skip_to_align_to(struct bt_bfcr *bfcr, size_t align) { size_t aligned_packet_at; - aligned_packet_at = ALIGN(packet_at(bfcr), align); + aligned_packet_at = BT_ALIGN(packet_at(bfcr), align); return aligned_packet_at - packet_at(bfcr); } @@ -983,7 +987,7 @@ enum bt_bfcr_status align_class_state(struct bt_bfcr *bfcr, * 0 means "undefined" for variants; what we really want is 1 * (always aligned) */ - BT_ASSERT(field_alignment >= 1); + BT_ASSERT_DBG(field_alignment >= 1); /* Compute how many bits we need to skip */ skip_bits = bits_to_skip_to_align_to(bfcr, (size_t) field_alignment); @@ -1011,7 +1015,7 @@ enum bt_bfcr_status align_class_state(struct bt_bfcr *bfcr, goto end; } else { /* No: need more data */ - BT_LOGV("Reached end of data when aligning: bfcr-addr=%p", bfcr); + BT_COMP_LOGT("Reached end of data when aligning: bfcr-addr=%p", bfcr); status = BT_BFCR_STATUS_EOF; } @@ -1036,13 +1040,13 @@ enum bt_bfcr_status next_field_state(struct bt_bfcr *bfcr) /* Are we done with this base class? */ while (top->index == top->base_len) { if (bfcr->user.cbs.classes.compound_end) { - BT_LOGV("Calling user function (compound, end)."); + BT_COMP_LOGT("Calling user function (compound, end)."); status = bfcr->user.cbs.classes.compound_end( top->base_class, bfcr->user.data); - BT_LOGV("User function returned: status=%s", + BT_COMP_LOGT("User function returned: status=%s", bt_bfcr_status_string(status)); if (status != BT_BFCR_STATUS_OK) { - BT_LOGW("User function failed: bfcr-addr=%p, status=%s", + BT_COMP_LOGW("User function failed: bfcr-addr=%p, status=%s", bfcr, bt_bfcr_status_string(status)); goto end; } @@ -1086,7 +1090,7 @@ enum bt_bfcr_status next_field_state(struct bt_bfcr *bfcr) } if (!next_field_class) { - BT_LOGW("Cannot get the field class of the next field: " + BT_COMP_LOGW("Cannot get the field class of the next field: " "bfcr-addr=%p, base-fc-addr=%p, base-fc-type=%d, " "index=%" PRId64, bfcr, top->base_class, top->base_class->type, @@ -1097,13 +1101,13 @@ enum bt_bfcr_status next_field_state(struct bt_bfcr *bfcr) if (next_field_class->is_compound) { if (bfcr->user.cbs.classes.compound_begin) { - BT_LOGV("Calling user function (compound, begin)."); + BT_COMP_LOGT("Calling user function (compound, begin)."); status = bfcr->user.cbs.classes.compound_begin( next_field_class, bfcr->user.data); - BT_LOGV("User function returned: status=%s", + BT_COMP_LOGT("User function returned: status=%s", bt_bfcr_status_string(status)); if (status != BT_BFCR_STATUS_OK) { - BT_LOGW("User function failed: bfcr-addr=%p, status=%s", + BT_COMP_LOGW("User function failed: bfcr-addr=%p, status=%s", bfcr, bt_bfcr_status_string(status)); goto end; } @@ -1120,7 +1124,7 @@ enum bt_bfcr_status next_field_state(struct bt_bfcr *bfcr) bfcr->state = BFCR_STATE_ALIGN_COMPOUND; } else { /* Replace current basic field class */ - BT_LOGV("Replacing current basic field class: " + BT_COMP_LOGT("Replacing current basic field class: " "bfcr-addr=%p, cur-basic-fc-addr=%p, " "next-basic-fc-addr=%p", bfcr, bfcr->cur_basic_field_class, next_field_class); @@ -1139,7 +1143,7 @@ enum bt_bfcr_status handle_state(struct bt_bfcr *bfcr) { enum bt_bfcr_status status = BT_BFCR_STATUS_OK; - BT_LOGV("Handling state: bfcr-addr=%p, state=%s", + BT_COMP_LOGT("Handling state: bfcr-addr=%p, state=%s", bfcr, bfcr_state_string(bfcr->state)); switch (bfcr->state) { @@ -1164,26 +1168,31 @@ enum bt_bfcr_status handle_state(struct bt_bfcr *bfcr) break; } - BT_LOGV("Handled state: bfcr-addr=%p, status=%s", + BT_COMP_LOGT("Handled state: bfcr-addr=%p, status=%s", bfcr, bt_bfcr_status_string(status)); return status; } BT_HIDDEN -struct bt_bfcr *bt_bfcr_create(struct bt_bfcr_cbs cbs, void *data) +struct bt_bfcr *bt_bfcr_create(struct bt_bfcr_cbs cbs, void *data, + bt_logging_level log_level, bt_self_component *self_comp) { struct bt_bfcr *bfcr; - BT_LOGD_STR("Creating binary class reader (BFCR)."); + BT_COMP_LOG_CUR_LVL(BT_LOG_DEBUG, log_level, self_comp, + "Creating binary field class reader (BFCR)."); bfcr = g_new0(struct bt_bfcr, 1); if (!bfcr) { - BT_LOGE_STR("Failed to allocate one binary class reader."); + BT_COMP_LOG_CUR_LVL(BT_LOG_ERROR, log_level, self_comp, + "Failed to allocate one binary class reader."); goto end; } - bfcr->stack = stack_new(); + bfcr->log_level = log_level; + bfcr->self_comp = self_comp; + bfcr->stack = stack_new(bfcr); if (!bfcr->stack) { - BT_LOGE_STR("Cannot create BFCR's stack."); + BT_COMP_LOGE_STR("Cannot create BFCR's stack."); bt_bfcr_destroy(bfcr); bfcr = NULL; goto end; @@ -1192,7 +1201,7 @@ struct bt_bfcr *bt_bfcr_create(struct bt_bfcr_cbs cbs, void *data) bfcr->state = BFCR_STATE_NEXT_FIELD; bfcr->user.cbs = cbs; bfcr->user.data = data; - BT_LOGD("Created BFCR: addr=%p", bfcr); + BT_COMP_LOGD("Created BFCR: addr=%p", bfcr); end: return bfcr; @@ -1205,24 +1214,24 @@ void bt_bfcr_destroy(struct bt_bfcr *bfcr) stack_destroy(bfcr->stack); } - BT_LOGD("Destroying BFCR: addr=%p", bfcr); + BT_COMP_LOGD("Destroying BFCR: addr=%p", bfcr); g_free(bfcr); } static void reset(struct bt_bfcr *bfcr) { - BT_LOGD("Resetting BFCR: addr=%p", bfcr); + BT_COMP_LOGD("Resetting BFCR: addr=%p", bfcr); stack_clear(bfcr->stack); stitch_reset(bfcr); bfcr->buf.addr = NULL; - bfcr->last_bo = -1; + bfcr->last_bo = CTF_BYTE_ORDER_UNKNOWN; } static void update_packet_offset(struct bt_bfcr *bfcr) { - BT_LOGV("Updating packet offset for next call: " + BT_COMP_LOGT("Updating packet offset for next call: " "bfcr-addr=%p, cur-packet-offset=%zu, next-packet-offset=%zu", bfcr, bfcr->buf.packet_offset, bfcr->buf.packet_offset + bfcr->buf.at); @@ -1235,8 +1244,8 @@ size_t bt_bfcr_start(struct bt_bfcr *bfcr, size_t offset, size_t packet_offset, size_t sz, enum bt_bfcr_status *status) { - BT_ASSERT(bfcr); - BT_ASSERT(BYTES_TO_BITS(sz) >= offset); + BT_ASSERT_DBG(bfcr); + BT_ASSERT_DBG(BYTES_TO_BITS(sz) >= offset); reset(bfcr); bfcr->buf.addr = buf; bfcr->buf.offset = offset; @@ -1246,7 +1255,7 @@ size_t bt_bfcr_start(struct bt_bfcr *bfcr, bfcr->buf.sz = BYTES_TO_BITS(sz) - offset; *status = BT_BFCR_STATUS_OK; - BT_LOGV("Starting decoding: bfcr-addr=%p, fc-addr=%p, " + BT_COMP_LOGT("Starting decoding: bfcr-addr=%p, fc-addr=%p, " "buf-addr=%p, buf-size=%zu, offset=%zu, " "packet-offset=%zu", bfcr, cls, buf, sz, offset, packet_offset); @@ -1257,13 +1266,13 @@ size_t bt_bfcr_start(struct bt_bfcr *bfcr, int stack_ret; if (bfcr->user.cbs.classes.compound_begin) { - BT_LOGV("Calling user function (compound, begin)."); + BT_COMP_LOGT("Calling user function (compound, begin)."); *status = bfcr->user.cbs.classes.compound_begin( cls, bfcr->user.data); - BT_LOGV("User function returned: status=%s", + BT_COMP_LOGT("User function returned: status=%s", bt_bfcr_status_string(*status)); if (*status != BT_BFCR_STATUS_OK) { - BT_LOGW("User function failed: bfcr-addr=%p, status=%s", + BT_COMP_LOGW("User function failed: bfcr-addr=%p, status=%s", bfcr, bt_bfcr_status_string(*status)); goto end; } @@ -1284,7 +1293,7 @@ size_t bt_bfcr_start(struct bt_bfcr *bfcr, } /* Run the machine! */ - BT_LOGV_STR("Running the state machine."); + BT_COMP_LOGT_STR("Running the state machine."); while (true) { *status = handle_state(bfcr); @@ -1305,9 +1314,9 @@ BT_HIDDEN size_t bt_bfcr_continue(struct bt_bfcr *bfcr, const uint8_t *buf, size_t sz, enum bt_bfcr_status *status) { - BT_ASSERT(bfcr); - BT_ASSERT(buf); - BT_ASSERT(sz > 0); + BT_ASSERT_DBG(bfcr); + BT_ASSERT_DBG(buf); + BT_ASSERT_DBG(sz > 0); bfcr->buf.addr = buf; bfcr->buf.offset = 0; bfcr->buf.at = 0; @@ -1315,11 +1324,11 @@ size_t bt_bfcr_continue(struct bt_bfcr *bfcr, const uint8_t *buf, size_t sz, bfcr->buf.sz = BYTES_TO_BITS(sz); *status = BT_BFCR_STATUS_OK; - BT_LOGV("Continuing decoding: bfcr-addr=%p, buf-addr=%p, buf-size=%zu", + BT_COMP_LOGT("Continuing decoding: bfcr-addr=%p, buf-addr=%p, buf-size=%zu", bfcr, buf, sz); /* Continue running the machine */ - BT_LOGV_STR("Running the state machine."); + BT_COMP_LOGT_STR("Running the state machine."); while (true) { *status = handle_state(bfcr); @@ -1338,7 +1347,7 @@ BT_HIDDEN void bt_bfcr_set_unsigned_int_cb(struct bt_bfcr *bfcr, bt_bfcr_unsigned_int_cb_func cb) { - BT_ASSERT(bfcr); - BT_ASSERT(cb); + BT_ASSERT_DBG(bfcr); + BT_ASSERT_DBG(cb); bfcr->user.cbs.classes.unsigned_int = cb; }