[vlc-devel] commit: Thread fatal errors: add function name, and some Win32 support ( Rémi Denis-Courmont )
git version control
git at videolan.org
Thu Sep 4 19:29:14 CEST 2008
vlc | branch: master | Rémi Denis-Courmont <rdenis at simphalempin.com> | Thu Sep 4 20:32:05 2008 +0300| [85a8e8a7221d4d44e7261983fc7bb28a352c94a4] | committer: Rémi Denis-Courmont
Thread fatal errors: add function name, and some Win32 support
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=85a8e8a7221d4d44e7261983fc7bb28a352c94a4
---
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 6970358..e19d874 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 5b676c2..2ae280c 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 7d62c3f..e49cd12 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 <execinfo.h>
+#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 <execinfo.h>
+#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
More information about the vlc-devel
mailing list