From 85a8e8a7221d4d44e7261983fc7bb28a352c94a4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Thu, 4 Sep 2008 20:32:05 +0300 Subject: [PATCH] Thread fatal errors: add function name, and some Win32 support --- include/vlc_threads.h | 4 +-- src/libvlccore.sym | 2 +- src/misc/threads.c | 58 +++++++++++++++++++++++++------------------ 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/include/vlc_threads.h b/include/vlc_threads.h index 6970358b41..e19d874775 100644 --- a/include/vlc_threads.h +++ b/include/vlc_threads.h @@ -201,12 +201,12 @@ enum { #define vlc_mutex_lock( P_MUTEX ) \ __vlc_mutex_lock( __FILE__, __LINE__, P_MUTEX ) -VLC_EXPORT(void, vlc_pthread_fatal, (const char *action, int error, const char *file, unsigned line)); +VLC_EXPORT(void, vlc_thread_fatal, (const char *action, int error, const char *function, const char *file, unsigned line)); #if defined(LIBVLC_USE_PTHREAD) # define VLC_THREAD_ASSERT( action ) \ if (val) \ - vlc_pthread_fatal (action, val, psz_file, i_line) + vlc_thread_fatal (action, val, __func__, psz_file, i_line) #else # define VLC_THREAD_ASSERT ((void)(val)) #endif diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 5b676c278f..2ae280c647 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -482,7 +482,6 @@ __vlc_object_wait __vlc_object_waitpipe __vlc_object_yield vlc_poll -vlc_pthread_fatal vlc_rand_bytes vlc_recvmsg vlc_sdp_Start @@ -492,6 +491,7 @@ vlc_strlcpy vlc_strtoll vlc_submodule_create __vlc_thread_create +vlc_thread_fatal __vlc_thread_join __vlc_thread_set_priority vlc_threadvar_create diff --git a/src/misc/threads.c b/src/misc/threads.c index 7d62c3f543..e49cd1281d 100644 --- a/src/misc/threads.c +++ b/src/misc/threads.c @@ -66,28 +66,54 @@ libvlc_global_data_t *vlc_global( void ) return p_root; } -#if defined(LIBVLC_USE_PTHREAD) +#ifdef HAVE_EXECINFO_H +# include +#endif + +/** + * Print a backtrace to the standard error for debugging purpose. + */ +void vlc_trace (const char *fn, const char *file, unsigned line) +{ + fprintf (stderr, "at %s:%u in %s\n", file, line, fn); + fflush (stderr); /* needed before switch to low-level I/O */ +#ifdef HAVE_BACKTRACE + void *stack[20]; + int len = backtrace (stack, sizeof (stack) / sizeof (stack[0])); + backtrace_symbols_fd (stack, len, 2); +#endif +#ifndef WIN32 + fsync (2); +#endif +} + static inline unsigned long vlc_threadid (void) { +#if defined(LIBVLC_USE_PTHREAD) union { pthread_t th; unsigned long int i; } v = { }; v.th = pthread_self (); return v.i; -} -#if defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) -# include +#elif defined (WIN32) + return GetCurrentThread (); + +#else + return 0; + #endif +} /***************************************************************************** * vlc_thread_fatal: Report an error from the threading layer ***************************************************************************** * This is mostly meant for debugging. *****************************************************************************/ -void vlc_pthread_fatal (const char *action, int error, +void vlc_thread_fatal (const char *action, int error, const char *function, const char *file, unsigned line) { - fprintf (stderr, "LibVLC fatal error %s in thread %lu at %s:%u: %d\n", - action, vlc_threadid (), file, line, error); + fprintf (stderr, "LibVLC fatal error %s (%d) in thread %lu ", + action, error, vlc_threadid ()); + vlc_trace (function, file, line); /* Sometimes strerror_r() crashes too, so make sure we print an error * message before we invoke it */ @@ -115,24 +141,8 @@ void vlc_pthread_fatal (const char *action, int error, #endif fflush (stderr); -#ifdef HAVE_BACKTRACE - void *stack[20]; - int len = backtrace (stack, sizeof (stack) / sizeof (stack[0])); - backtrace_symbols_fd (stack, len, 2); -#endif - abort (); } -#else -void vlc_pthread_fatal (const char *action, int error, - const char *file, unsigned line) -{ - (void)action; (void)error; (void)file; (void)line; - abort(); -} - -static vlc_threadvar_t cancel_key; -#endif /** * Per-thread cancellation data @@ -604,7 +614,7 @@ void vlc_join (vlc_thread_t handle, void **result) #if defined( LIBVLC_USE_PTHREAD ) int val = pthread_join (handle, result); if (val) - vlc_pthread_fatal ("joining thread", val, __FILE__, __LINE__); + vlc_thread_fatal ("joining thread", val, __func__, __FILE__, __LINE__); #elif defined( UNDER_CE ) || defined( WIN32 ) do -- 2.39.5