#include #include #include #include #include #include #include #include static char mprintf_buffer[MPRINTF_BUF_MAX]; static atomic_flag mprintf_buffer_lock1 = ATOMIC_FLAG_INIT; static void mprintf_buffer_lock (void) { while (atomic_flag_test_and_set_explicit (&mprintf_buffer_lock1, memory_order_acquire)) { #if defined(__x86_64__) __asm__ volatile ("pause" ::: "memory"); #endif } } static void mprintf_buffer_unlock (void) { atomic_flag_clear_explicit (&mprintf_buffer_lock1, memory_order_release); } void mprintf (const char* fmt, ...) { va_list args; va_start (args, fmt); mprintf_buffer_lock (); int len = vsnprintf (mprintf_buffer, MPRINTF_BUF_MAX, fmt, args); va_end (args); stream_write (process_get_pgid (), STREAM_OUT, mprintf_buffer, len); mprintf_buffer_unlock (); }