atomic-dbg

Crates.ioatomic-dbg
lib.rsatomic-dbg
version0.1.9
sourcesrc
created_at2022-05-04 23:32:01.504728
updated_at2023-12-07 14:40:14.061552
descriptionAtomic `dbg`/`eprintln`/`eprint` macros
homepage
repositoryhttps://github.com/sunfishcode/atomic-dbg
max_upload_size
id580736
size55,178
Dan Gohman (sunfishcode)

documentation

https://docs.rs/atomic-dbg

README

atomic-dbg

crates.io page docs.rs docs

This crate provides dbg, eprint, and eprintln, macros which work just like their counterparts in std, but which:

  • Write atomically, up to the greatest length supported on the platform.
  • Don't use locks (in userspace) or dynamic allocations.
  • Preserve libc's errno and Windows' last-error code value.

This means they can be used just about anywhere within a program, including inside allocator implementations, inside synchronization primitives, startup code, around FFI calls, inside signal handlers, and in the child process of a fork before an exec.

And, when multiple threads are printing, as long as they're within the length supported on the platform, the output is readable instead of potentially interleaved with other output.

For example, this code:

use atomic_dbg::dbg;

fn main() {
    dbg!(2, 3, 4);
}

Has this strace output:

write(2, "[examples/dbg.rs:4] 2 = 2\n[examples/dbg.rs:4] 3 = 3\n[examples/dbg.rs:4] 4 = 4\n", 78[examples/dbg.rs:4] 2 = 2

which is a single atomic write call.

For comparison, with std::dbg it looks like this:

write(2, "[", 1[)                        = 1
write(2, "examples/dbg.rs", 15examples/dbg.rs)         = 15
write(2, ":", 1:)                        = 1
write(2, "4", 14)                        = 1
write(2, "] ", 2] )                       = 2
write(2, "2", 12)                        = 1
write(2, " = ", 3 = )                      = 3
write(2, "2", 12)                        = 1
write(2, "\n", 1
)                       = 1
write(2, "[", 1[)                        = 1
write(2, "examples/dbg.rs", 15examples/dbg.rs)         = 15
write(2, ":", 1:)                        = 1
write(2, "4", 14)                        = 1
write(2, "] ", 2] )                       = 2
write(2, "3", 13)                        = 1
write(2, " = ", 3 = )                      = 3
write(2, "3", 13)                        = 1
write(2, "\n", 1
)                       = 1
write(2, "[", 1[)                        = 1
write(2, "examples/dbg.rs", 15examples/dbg.rs)         = 15
write(2, ":", 1:)                        = 1
write(2, "4", 14)                        = 1
write(2, "] ", 2] )                       = 2
write(2, "4", 14)                        = 1
write(2, " = ", 3 = )                      = 3
write(2, "4", 14)                        = 1
write(2, "\n", 1
)                       = 1

atomic-dbg is no_std, however like std, it uses the stderr file descriptor ambiently, assuming that it's open.

Logging

With the "log" feature enabled, atomic-dbg defines an atomic_dbg::log::init which installed a minimal logging implementation using the eprintln macro.

Commit count: 27

cargo fmt