Skip to content

Commit b0ea5da

Browse files
committed
Add C API support for retrieving current log level
1 parent ca9d405 commit b0ea5da

File tree

4 files changed

+64
-23
lines changed

4 files changed

+64
-23
lines changed

c-api-tests/cases/log.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,41 +11,46 @@
1111
a = spidir_builder_build_icmp(builder, SPIDIR_ICMP_##kind, \
1212
SPIDIR_TYPE_I32, a, b)
1313

14+
static void set_log_level(spidir_log_level_t level) {
15+
spidir_log_set_max_level(level);
16+
ASSERT(spidir_log_get_max_level() == level);
17+
}
18+
1419
void builder_callback(spidir_builder_handle_t builder, void* ctx) {
1520
(void) ctx;
1621

1722
spidir_block_t block = spidir_builder_create_block(builder);
1823
spidir_builder_set_entry_block(builder, block);
1924
spidir_builder_set_block(builder, block);
2025

21-
spidir_log_set_max_level(SPIDIR_LOG_LEVEL_ERROR);
26+
set_log_level(SPIDIR_LOG_LEVEL_ERROR);
2227
spidir_value_t a = spidir_builder_build_param_ref(builder, 0);
2328
spidir_value_t b = spidir_builder_build_param_ref(builder, 0);
2429

2530
BUILD_BINOP(iadd);
2631
BUILD_BINOP(isub);
2732
BUILD_BINOP(and);
28-
spidir_log_set_max_level(SPIDIR_LOG_LEVEL_WARN);
33+
set_log_level(SPIDIR_LOG_LEVEL_WARN);
2934
BUILD_BINOP(or);
3035
BUILD_BINOP(xor);
31-
spidir_log_set_max_level(SPIDIR_LOG_LEVEL_DEBUG);
36+
set_log_level(SPIDIR_LOG_LEVEL_DEBUG);
3237
BUILD_BINOP(shl);
3338
BUILD_BINOP(lshr);
3439
BUILD_BINOP(ashr);
3540
BUILD_BINOP(imul);
36-
spidir_log_set_max_level(SPIDIR_LOG_LEVEL_TRACE);
41+
set_log_level(SPIDIR_LOG_LEVEL_TRACE);
3742
BUILD_BINOP(sdiv);
3843
BUILD_BINOP(udiv);
3944
BUILD_ICMP(EQ);
4045
BUILD_ICMP(NE);
4146
BUILD_ICMP(SLT);
42-
spidir_log_set_max_level(SPIDIR_LOG_LEVEL_INFO);
47+
set_log_level(SPIDIR_LOG_LEVEL_INFO);
4348
BUILD_ICMP(SLE);
4449
BUILD_ICMP(ULT);
4550
BUILD_ICMP(ULE);
4651

4752
a = spidir_builder_build_iext(builder, a);
48-
spidir_log_set_max_level(SPIDIR_LOG_LEVEL_NONE);
53+
set_log_level(SPIDIR_LOG_LEVEL_NONE);
4954
a = spidir_builder_build_itrunc(builder, a);
5055
a = spidir_builder_build_sfill(builder, 16, a);
5156

@@ -55,6 +60,8 @@ void builder_callback(spidir_builder_handle_t builder, void* ctx) {
5560
int main(void) {
5661
init_stdout_spidir_log();
5762

63+
ASSERT(spidir_log_get_max_level() == SPIDIR_LOG_LEVEL_NONE);
64+
5865
spidir_module_handle_t module = spidir_module_create();
5966

6067
spidir_value_type_t ret_type = SPIDIR_TYPE_I32;

c-api-tests/cases/log_disabled.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,41 +11,46 @@
1111
a = spidir_builder_build_icmp(builder, SPIDIR_ICMP_##kind, \
1212
SPIDIR_TYPE_I32, a, b)
1313

14+
static void set_log_level(spidir_log_level_t level) {
15+
spidir_log_set_max_level(level);
16+
ASSERT(spidir_log_get_max_level() == SPIDIR_LOG_LEVEL_NONE);
17+
}
18+
1419
void builder_callback(spidir_builder_handle_t builder, void* ctx) {
1520
(void) ctx;
1621

1722
spidir_block_t block = spidir_builder_create_block(builder);
1823
spidir_builder_set_entry_block(builder, block);
1924
spidir_builder_set_block(builder, block);
2025

21-
spidir_log_set_max_level(SPIDIR_LOG_LEVEL_ERROR);
26+
set_log_level(SPIDIR_LOG_LEVEL_ERROR);
2227
spidir_value_t a = spidir_builder_build_param_ref(builder, 0);
2328
spidir_value_t b = spidir_builder_build_param_ref(builder, 0);
2429

2530
BUILD_BINOP(iadd);
2631
BUILD_BINOP(isub);
2732
BUILD_BINOP(and);
28-
spidir_log_set_max_level(SPIDIR_LOG_LEVEL_WARN);
33+
set_log_level(SPIDIR_LOG_LEVEL_WARN);
2934
BUILD_BINOP(or);
3035
BUILD_BINOP(xor);
31-
spidir_log_set_max_level(SPIDIR_LOG_LEVEL_DEBUG);
36+
set_log_level(SPIDIR_LOG_LEVEL_DEBUG);
3237
BUILD_BINOP(shl);
3338
BUILD_BINOP(lshr);
3439
BUILD_BINOP(ashr);
3540
BUILD_BINOP(imul);
36-
spidir_log_set_max_level(SPIDIR_LOG_LEVEL_TRACE);
41+
set_log_level(SPIDIR_LOG_LEVEL_TRACE);
3742
BUILD_BINOP(sdiv);
3843
BUILD_BINOP(udiv);
3944
BUILD_ICMP(EQ);
4045
BUILD_ICMP(NE);
4146
BUILD_ICMP(SLT);
42-
spidir_log_set_max_level(SPIDIR_LOG_LEVEL_INFO);
47+
set_log_level(SPIDIR_LOG_LEVEL_INFO);
4348
BUILD_ICMP(SLE);
4449
BUILD_ICMP(ULT);
4550
BUILD_ICMP(ULE);
4651

4752
a = spidir_builder_build_iext(builder, a);
48-
spidir_log_set_max_level(SPIDIR_LOG_LEVEL_NONE);
53+
set_log_level(SPIDIR_LOG_LEVEL_NONE);
4954
a = spidir_builder_build_itrunc(builder, a);
5055
a = spidir_builder_build_sfill(builder, 16, a);
5156

@@ -55,6 +60,8 @@ void builder_callback(spidir_builder_handle_t builder, void* ctx) {
5560
int main(void) {
5661
init_stdout_spidir_log();
5762

63+
ASSERT(spidir_log_get_max_level() == SPIDIR_LOG_LEVEL_NONE);
64+
5865
spidir_module_handle_t module = spidir_module_create();
5966

6067
spidir_value_type_t ret_type = SPIDIR_TYPE_I32;

c-api/include/spidir/log.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,7 @@ void spidir_log_init(spidir_log_callback_t callback);
5656
/// should be overridden with this function if logs are to be received.
5757
void spidir_log_set_max_level(spidir_log_level_t level);
5858

59+
/// Returns the current maximum level for logs to be delivered.
60+
spidir_log_level_t spidir_log_get_max_level(void);
61+
5962
#endif

c-api/src/log.rs

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,32 @@
1+
// The log levels aren't always all used, but it's cleaner to define them together.
2+
#![allow(unused)]
3+
14
use core::ffi::c_char;
25

36
type ApiLevel = u8;
47
type LogCallback = extern "C" fn(ApiLevel, *const c_char, usize, *const c_char, usize);
58

9+
const SPIDIR_LOG_LEVEL_NONE: ApiLevel = 0;
10+
const SPIDIR_LOG_LEVEL_ERROR: ApiLevel = 1;
11+
const SPIDIR_LOG_LEVEL_WARN: ApiLevel = 2;
12+
const SPIDIR_LOG_LEVEL_INFO: ApiLevel = 3;
13+
const SPIDIR_LOG_LEVEL_DEBUG: ApiLevel = 4;
14+
const SPIDIR_LOG_LEVEL_TRACE: ApiLevel = 5;
15+
616
#[cfg(feature = "no_logging")]
717
mod imp {
8-
use super::{ApiLevel, LogCallback};
18+
use super::{ApiLevel, LogCallback, SPIDIR_LOG_LEVEL_NONE};
919

1020
#[unsafe(no_mangle)]
1121
unsafe extern "C" fn spidir_log_init(_callback: LogCallback) {}
1222

1323
#[unsafe(no_mangle)]
1424
unsafe extern "C" fn spidir_log_set_max_level(_level: ApiLevel) {}
25+
26+
#[unsafe(no_mangle)]
27+
unsafe extern "C" fn spidir_log_get_max_level() -> ApiLevel {
28+
SPIDIR_LOG_LEVEL_NONE
29+
}
1530
}
1631

1732
#[cfg(not(feature = "no_logging"))]
@@ -25,14 +40,7 @@ mod imp {
2540

2641
use log::{Level, LevelFilter, Log};
2742

28-
use super::{ApiLevel, LogCallback};
29-
30-
const SPIDIR_LOG_LEVEL_NONE: u8 = 0;
31-
const SPIDIR_LOG_LEVEL_ERROR: u8 = 1;
32-
const SPIDIR_LOG_LEVEL_WARN: u8 = 2;
33-
const SPIDIR_LOG_LEVEL_INFO: u8 = 3;
34-
const SPIDIR_LOG_LEVEL_DEBUG: u8 = 4;
35-
const SPIDIR_LOG_LEVEL_TRACE: u8 = 5;
43+
use super::*;
3644

3745
fn log_level_to_api(level: Level) -> ApiLevel {
3846
match level {
@@ -44,7 +52,18 @@ mod imp {
4452
}
4553
}
4654

47-
fn log_level_from_api(level: ApiLevel) -> LevelFilter {
55+
fn log_filter_to_api(level: LevelFilter) -> ApiLevel {
56+
match level {
57+
LevelFilter::Off => SPIDIR_LOG_LEVEL_NONE,
58+
LevelFilter::Error => SPIDIR_LOG_LEVEL_ERROR,
59+
LevelFilter::Warn => SPIDIR_LOG_LEVEL_WARN,
60+
LevelFilter::Info => SPIDIR_LOG_LEVEL_INFO,
61+
LevelFilter::Debug => SPIDIR_LOG_LEVEL_DEBUG,
62+
LevelFilter::Trace => SPIDIR_LOG_LEVEL_TRACE,
63+
}
64+
}
65+
66+
fn log_filter_from_api(level: ApiLevel) -> LevelFilter {
4867
match level {
4968
SPIDIR_LOG_LEVEL_NONE => LevelFilter::Off,
5069
SPIDIR_LOG_LEVEL_ERROR => LevelFilter::Error,
@@ -94,6 +113,11 @@ mod imp {
94113

95114
#[unsafe(no_mangle)]
96115
unsafe extern "C" fn spidir_log_set_max_level(level: ApiLevel) {
97-
log::set_max_level(log_level_from_api(level));
116+
log::set_max_level(log_filter_from_api(level));
117+
}
118+
119+
#[unsafe(no_mangle)]
120+
unsafe extern "C" fn spidir_log_get_max_level() -> ApiLevel {
121+
log_filter_to_api(log::max_level())
98122
}
99123
}

0 commit comments

Comments
 (0)