Skip to content

print! does not work after shutdown if no previous print occurred #101375

Closed
@joboet

Description

@joboet

I tried this code:

fn main() {
    extern "C" fn bye() {
        print!("hello, world!");
    }
    unsafe { libc::atexit(bye) };
}

I expected to see this happen:

The code should print "hello, world!", which it does if any print statement occurred before it (see the test).

Instead, this happened:

Nothing is printed to standard output.

The bug is in the cleanup function that disables buffering during shutdown:

pub fn cleanup() {
if let Some(instance) = STDOUT.get() {
// Flush the data and disable buffering during shutdown
// by replacing the line writer by one with zero
// buffering capacity.
// We use try_lock() instead of lock(), because someone
// might have leaked a StdoutLock, which would
// otherwise cause a deadlock here.
if let Some(lock) = Pin::static_ref(instance).try_lock() {
*lock.borrow_mut() = LineWriter::with_capacity(0, stdout_raw());
}
}
}

If the buffer has not been initialized yet, that will not occur, so the print statement will initialize the buffer in the normal fashion and it will not be flushed.

Meta

rustc --version --verbose:

rustc 1.63.0 (4b91a6ea7 2022-08-08)
binary: rustc
commit-hash: 4b91a6ea7258a947e59c6522cd5898e7c0a6a88f
commit-date: 2022-08-08
host: aarch64-apple-darwin
release: 1.63.0
LLVM version: 14.0.5

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: This is a bug.T-libsRelevant to the library team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions