🐛 fix native file sink lifecycle behavior

This commit is contained in:
Nanaloveyuki
2026-06-14 12:55:29 +08:00
parent 159f534164
commit 31f06f5724
15 changed files with 110 additions and 39 deletions
+25 -24
View File
@@ -642,24 +642,22 @@ test "configured logger queue helpers stay aligned with runtime sink helpers" {
}
test "configured logger close stays aligned with runtime sink close" {
let console_logger = build_logger(
LoggerConfig::new(
min_level=Level::Info,
target="config.close.console",
sink=SinkConfig::new(kind=SinkKind::Console),
queue=Some(QueueConfig::new(2, overflow=QueueOverflowPolicy::DropNewest)),
),
let console_config = LoggerConfig::new(
min_level=Level::Info,
target="config.close.console",
sink=SinkConfig::new(kind=SinkKind::Console),
queue=Some(QueueConfig::new(2, overflow=QueueOverflowPolicy::DropNewest)),
)
let console_sink = console_logger.sink
let console_logger = build_logger(console_config)
let console_sink = build_logger(console_config).sink
inspect(console_logger.close() == console_sink.close(), content="true")
let file_logger = build_logger(
LoggerConfig::new(
target="config.close.file",
sink=SinkConfig::new(kind=SinkKind::File, path="config-close.log"),
),
let file_config = LoggerConfig::new(
target="config.close.file",
sink=SinkConfig::new(kind=SinkKind::File, path="config-close.log"),
)
let file_sink = file_logger.sink
let file_logger = build_logger(file_config)
let file_sink = build_logger(file_config).sink
inspect(file_logger.close() == file_sink.close(), content="true")
}
@@ -1628,20 +1626,18 @@ test "configured logger exposes file flush and close helpers" {
}
test "configured logger file flush and close stay aligned with runtime sink helpers" {
let file_logger = build_logger(
LoggerConfig::new(
sink=SinkConfig::new(kind=SinkKind::File, path="config-file-helper-delegate.log"),
),
let file_config = LoggerConfig::new(
sink=SinkConfig::new(kind=SinkKind::File, path="config-file-helper-delegate.log"),
)
let file_sink = file_logger.sink
let file_logger = build_logger(file_config)
let file_sink = build_logger(file_config).sink
inspect(file_logger.file_flush() == file_sink.file_flush(), content="true")
inspect(file_logger.file_close() == file_sink.file_close(), content="true")
let console_logger = build_logger(
LoggerConfig::new(sink=SinkConfig::new(kind=SinkKind::Console)),
)
let console_sink = console_logger.sink
let console_config = LoggerConfig::new(sink=SinkConfig::new(kind=SinkKind::Console))
let console_logger = build_logger(console_config)
let console_sink = build_logger(console_config).sink
inspect(console_logger.file_flush() == console_sink.file_flush(), content="true")
inspect(console_logger.file_close() == console_sink.file_close(), content="true")
@@ -2715,7 +2711,12 @@ test "configured logger projection preserves file runtime helpers through unwrap
inspect(full.file_reset_failure_counters() == configured.file_reset_failure_counters(), content="true")
inspect(full.file_flush() == configured.file_flush(), content="true")
inspect(full.pending_count() == configured.pending_count(), content="true")
inspect(full.file_close() == configured.file_close(), content="true")
let was_available = configured.file_available()
inspect(configured.file_close() == was_available, content="true")
inspect(full.file_available(), content="false")
inspect(configured.file_available(), content="false")
inspect(full.file_close(), content="false")
}
test "default library logger mirrors shared sync defaults" {
+18
View File
@@ -6,6 +6,24 @@ test "default logger can be reconfigured" {
inspect(logger.target, content="global")
}
test "default logger snapshots shared defaults at creation time" {
set_default_min_level(Level::Warn)
set_default_target("before")
let before = default_logger()
set_default_min_level(Level::Debug)
set_default_target("after")
let after = default_logger()
inspect(before.is_enabled(Level::Error), content="true")
inspect(before.is_enabled(Level::Info), content="false")
inspect(before.target, content="before")
inspect(after.is_enabled(Level::Error), content="true")
inspect(after.is_enabled(Level::Info), content="true")
inspect(after.target, content="after")
}
test "logger can enable timestamps" {
let logger = Logger::new(console_sink(), min_level=Level::Info, target="time")
.with_timestamp()
+1 -1
View File
@@ -37,7 +37,7 @@ type NativeFileHandle
#borrow(path, mode)
extern "C" fn file_open_ffi(path : Bytes, mode : Bytes) -> NativeFileHandle = "fopen"
extern "C" fn file_is_null_ffi(handle : NativeFileHandle) -> Bool = "moonbitlang_async_pointer_is_null"
extern "C" fn file_is_null_ffi(handle : NativeFileHandle) -> Bool = "bitlogger_pointer_is_null"
#borrow(buffer)
extern "C" fn file_write_ffi(
+1
View File
@@ -7,6 +7,7 @@ import {
}
options(
"native-stub": [ "stub.c" ],
targets: {
"file_backend_native.mbt": [ "native", "llvm" ],
"file_backend_stub.mbt": [ "js", "wasm", "wasm-gc" ],
+5
View File
@@ -0,0 +1,5 @@
#include <stdint.h>
int32_t bitlogger_pointer_is_null(void *ptr) {
return ptr == 0;
}