#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
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 */
#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
#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