* SOFTWARE.
*/
-#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 <stdlib.h>
#include <stdint.h>
int64_t index;
};
+struct bt_bfcr;
+
/* Visit stack */
struct stack {
+ struct bt_bfcr *bfcr;
+
/* Entries (struct stack_entry) */
GArray *entries;
/* 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 */
{
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";
+ return "DONE";
default:
return "(unknown)";
}
}
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:
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);
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, "
+ 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,
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;
static
void stack_pop(struct stack *stack)
{
+ struct bt_bfcr *bfcr;
+
BT_ASSERT(stack);
BT_ASSERT(stack_size(stack));
- BT_LOGV("Popping from 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--;
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;
}
}
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)
{
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) {
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);
}
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);
}
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;
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;
}
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));
}
}
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));
}
} 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));
}
(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);
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));
}
/* 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;
(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;
}
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));
}
/* 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;
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;
}
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;
}
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;
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;
}
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;
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;
}
/* 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;
}
}
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,
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;
}
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);
{
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) {
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;
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;
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;
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);
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);
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;
}
}
/* Run the machine! */
- BT_LOGV_STR("Running the state machine.");
+ BT_COMP_LOGT_STR("Running the state machine.");
while (true) {
*status = handle_state(bfcr);
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);