The logging functions in SoX like lsx_debug, lsx_report, etc. write to the global struct sox_globals before calling the actual print functions. Example macro: #define lsx_report sox_globals.subsystem=__FILE__,lsx_report_impl This can create *race conditions* if run parallely. For example, two lsx_report calls are called parallely. lsx_report call 1 updates sox_globals.subsystem. lsx_report call 2 updates sox_globals.subsystem. lsx_report call 1 prints, but with incorrect subsystem of call 2. lsx_report call 2 prints with the correct subsystem. I am attaching a patch file to make the calls thread-friendly. Please let me know if the patch makes sense. -- Regards, Enzam (enzam@ ) *Inlined patch (also attached as file):* From 3be8226c8ca2b4f29b6927583641cb08ef39dddf Mon Sep 17 00:00:00 2001 From: "Md. Enzam Hossain" Date: Wed, 8 Sep 2021 12:03:02 -0700 Subject: [PATCH] Make logging thread friendly. If multiple threads tries to log together, the subsystem may get overwritten by each other. Remove the dependency on the global parameter. --- src/libsox.c | 4 ++-- src/mp3.c | 15 +++------------ src/sox.h | 32 ++++++++++++++++++-------------- src/sox_i.h | 16 ++++++++-------- 4 files changed, 31 insertions(+), 36 deletions(-) diff --git a/src/libsox.c b/src/libsox.c index 8e9ebad6..6fc0ec41 100644 --- a/src/libsox.c +++ b/src/libsox.c @@ -195,11 +195,11 @@ size_t sox_basename(char * base_buffer, size_t base_buffer_len, const char * fil } #define SOX_MESSAGE_FUNCTION(name,level) \ -void name(char const * fmt, ...) { \ +void name(char const * filename, char const * fmt, ...) { \ va_list ap; \ va_start(ap, fmt); \ if (sox_globals.output_message_handler) \ - (*sox_globals.output_message_handler)(level,sox_globals.subsystem,fmt,ap); \ + (*sox_globals.output_message_handler)(level,filename,fmt,ap); \ va_end(ap); \ } diff --git a/src/mp3.c b/src/mp3.c index 1fd144d1..552ab0db 100644 --- a/src/mp3.c +++ b/src/mp3.c @@ -680,26 +680,17 @@ static int startread(sox_format_t * ft) static void errorf(const char* fmt, va_list va) { - sox_globals.subsystem=__FILE__; - if (sox_globals.output_message_handler) - (*sox_globals.output_message_handler)(1,sox_globals.subsystem,fmt,va); - return; + lsx_fail(fmt, va); } static void debugf(const char* fmt, va_list va) { - sox_globals.subsystem=__FILE__; - if (sox_globals.output_message_handler) - (*sox_globals.output_message_handler)(4,sox_globals.subsystem,fmt,va); - return; + lsx_debug(fmt, va); } static void msgf(const char* fmt, va_list va) { - sox_globals.subsystem=__FILE__; - if (sox_globals.output_message_handler) - (*sox_globals.output_message_handler)(3,sox_globals.subsystem,fmt,va); - return; + lsx_report(fmt, va); } /* These functions are considered optional. If they aren't present in the diff --git a/src/sox.h b/src/sox.h index bac50354..b9cd9754 100644 --- a/src/sox.h +++ b/src/sox.h @@ -79,14 +79,14 @@ the variable being unused (especially in macro-generated code). /** Plugins API: -LSX_PRINTF12: Attribute applied to a function to indicate that it requires -a printf-style format string for arg1 and that printf parameters start at -arg2. +LSX_PRINTF23: Attribute applied to a function to indicate that it requires +a printf-style format string for arg2 and that printf parameters start at +arg3. */ #ifdef __GNUC__ -#define LSX_PRINTF12 __attribute__ ((format (printf, 1, 2))) /* Function has printf-style arguments. */ +#define LSX_PRINTF23 __attribute__ ((format (printf, 2, 3))) /* Function has printf-style arguments. */ #else -#define LSX_PRINTF12 /* Function has printf-style arguments. */ +#define LSX_PRINTF23 /* Function has printf-style arguments. */ #endif /** @@ -1330,7 +1330,7 @@ typedef struct sox_globals_t { char const * stdin_in_use_by; /**< Private: tracks the name of the handler currently using stdin */ char const * stdout_in_use_by; /**< Private: tracks the name of the handler currently using stdout */ - char const * subsystem; /**< Private: tracks the name of the handler currently writing an output message */ + char const * subsystem; /**< Deprecated, Private: tracks the name of the handler currently writing an output message */ char * tmp_path; /**< Private: client-configured path to use for temporary files */ sox_bool use_magic; /**< Private: true if client has requested use of 'magic' file-type detection */ sox_bool use_threads; /**< Private: true if client has requested parallel effects processing */ @@ -2273,9 +2273,10 @@ Print a fatal error in libSoX. void LSX_API lsx_fail_impl( + LSX_PARAM_IN_Z char const * filename, /**< Source code __FILE__ from which message originates. */ LSX_PARAM_IN_PRINTF char const * fmt, /**< printf-style format string. */ ...) - LSX_PRINTF12; + LSX_PRINTF23; /** Plugins API: @@ -2284,9 +2285,10 @@ Print a warning in libSoX. void LSX_API lsx_warn_impl( + LSX_PARAM_IN_Z char const * filename, /**< Source code __FILE__ from which message originates. */ LSX_PARAM_IN_PRINTF char const * fmt, /**< printf-style format string. */ ...) - LSX_PRINTF12; + LSX_PRINTF23; /** Plugins API: @@ -2295,9 +2297,10 @@ Print an informational message in libSoX. void LSX_API lsx_report_impl( + LSX_PARAM_IN_Z char const * filename, /**< Source code __FILE__ from which message originates. */ LSX_PARAM_IN_PRINTF char const * fmt, /**< printf-style format string. */ ...) - LSX_PRINTF12; + LSX_PRINTF23; /** Plugins API: @@ -2306,33 +2309,34 @@ Print a debug message in libSoX. void LSX_API lsx_debug_impl( + LSX_PARAM_IN_Z char const * filename, /**< Source code __FILE__ from which message originates. */ LSX_PARAM_IN_PRINTF char const * fmt, /**< printf-style format string. */ ...) - LSX_PRINTF12; + LSX_PRINTF23; /** Plugins API: Report a fatal error in libSoX; printf-style arguments must follow. */ -#define lsx_fail sox_get_globals()->subsystem=__FILE__,lsx_fail_impl +#define lsx_fail(...) lsx_fail_impl(__FILE__, __VA_ARGS__) /** Plugins API: Report a warning in libSoX; printf-style arguments must follow. */ -#define lsx_warn sox_get_globals()->subsystem=__FILE__,lsx_warn_impl +#define lsx_warn(...) lsx_warn_impl(__FILE__, __VA_ARGS__) /** Plugins API: Report an informational message in libSoX; printf-style arguments must follow. */ -#define lsx_report sox_get_globals()->subsystem=__FILE__,lsx_report_impl +#define lsx_report(...) lsx_report_impl(__FILE__, __VA_ARGS__) /** Plugins API: Report a debug message in libSoX; printf-style arguments must follow. */ -#define lsx_debug sox_get_globals()->subsystem=__FILE__,lsx_debug_impl +#define lsx_debug(...) lsx_debug_impl(__FILE__, __VA_ARGS__) /** Plugins API: diff --git a/src/sox_i.h b/src/sox_i.h index c8552f97..c843556c 100644 --- a/src/sox_i.h +++ b/src/sox_i.h @@ -31,10 +31,10 @@ #undef lsx_fail #undef lsx_report #undef lsx_warn -#define lsx_debug sox_globals.subsystem=effp->handler.name,lsx_debug_impl -#define lsx_fail sox_globals.subsystem=effp->handler.name,lsx_fail_impl -#define lsx_report sox_globals.subsystem=effp->handler.name,lsx_report_impl -#define lsx_warn sox_globals.subsystem=effp->handler.name,lsx_warn_impl +#define lsx_debug(...) lsx_debug_impl(effp->handler.name, __VA_ARGS__) +#define lsx_fail(...) lsx_fail_impl(effp->handler.name, __VA_ARGS__) +#define lsx_report(...) lsx_report_impl(effp->handler.name, __VA_ARGS__) +#define lsx_warn(...) lsx_warn_impl(effp->handler.name, __VA_ARGS__) #endif #define RANQD1 ranqd1(sox_globals.ranqd1) @@ -56,11 +56,11 @@ assert_static(sizeof(off_t) == _FILE_OFFSET_BITS >> 3, OFF_T_BUILD_PROBLEM); FILE * lsx_tmpfile(void); -void lsx_debug_more_impl(char const * fmt, ...) LSX_PRINTF12; -void lsx_debug_most_impl(char const * fmt, ...) LSX_PRINTF12; +void lsx_debug_more_impl(LSX_PARAM_IN_Z char const * filename, LSX_PARAM_IN_PRINTF char const * fmt, ...) LSX_PRINTF23; +void lsx_debug_most_impl(LSX_PARAM_IN_Z char const * filename, LSX_PARAM_IN_PRINTF char const * fmt, ...) LSX_PRINTF23; -#define lsx_debug_more sox_get_globals()->subsystem=__FILE__,lsx_debug_more_impl -#define lsx_debug_most sox_get_globals()->subsystem=__FILE__,lsx_debug_most_impl +#define lsx_debug_more(...) lsx_debug_more_impl(__FILE__, __VA_ARGS__) +#define lsx_debug_most(...) lsx_debug_most_impl(__FILE__, __VA_ARGS__) /* Digitise one cycle of a wave and store it as * a table of samples of a specified data-type. -- 2.33.0.153.gba50c8fa24-goog