vlc/vlc-1.1 | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Dec 5 01:17:10 2010 +0200| [39468dd6cbfca20eb0b4b1f278f70a874248c6f5] | committer: Rémi Denis-Courmont
Xlib: check if we can call XInitThreads() before we do so Parental advisory: naked kludge and explicit hack (cherry picked from commit abbdcb63d9f4161055e24faec1c7edcc9b83e44c) > http://git.videolan.org/gitweb.cgi/vlc/vlc-1.1.git/?a=commit;h=39468dd6cbfca20eb0b4b1f278f70a874248c6f5 --- include/vlc_xlib.h | 20 ++++++++++++++++++-- 1 files changed, 18 insertions(+), 2 deletions(-) diff --git a/include/vlc_xlib.h b/include/vlc_xlib.h index 4e3632c..969dcbc 100644 --- a/include/vlc_xlib.h +++ b/include/vlc_xlib.h @@ -21,7 +21,10 @@ #ifndef VLC_XLIB_H # define VLC_XLIB_H 1 +# include <stdio.h> +# include <stdlib.h> # include <X11/Xlib.h> +# include <X11/Xlibint.h> static inline bool vlc_xlib_init (vlc_object_t *obj) { @@ -30,9 +33,22 @@ static inline bool vlc_xlib_init (vlc_object_t *obj) if (var_InheritBool (obj, "xlib")) { /* XInitThreads() can be called multiple times, - * but it is not reentrant. */ + * but it is not reentrant, so we need this global lock. */ vlc_global_lock (VLC_XLIB_MUTEX); - ok = XInitThreads () != 0; + + if (_Xglobal_lock == NULL && unlikely(_XErrorFunction != NULL)) + { + /* (_Xglobal_lock == NULL) => Xlib threads not initialized */ + /* (_XErrorFunction != NULL) => Xlib already in use */ + fprintf (stderr, "%s:%u:%u: Xlib not initialized for threads.\n" + "This process is probably using LibVLC incorrectly.\n" + "Pass \"--no-xlib\" to libvlc_new() to fix this.\n", + __FILE__, __LINE__, __func__); + /* Initiate core meltdown */ + abort (); + } + else + ok = XInitThreads () != 0; vlc_global_unlock (VLC_XLIB_MUTEX); } return ok; _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
