From: RĂ©mi Denis-Courmont Date: Wed, 25 Jun 2008 18:59:53 +0000 (+0300) Subject: Use QPointer and QMutexLocker so we don't crash at Qt4 interface exit X-Git-Tag: 0.9.0-test1~121^2~7^2~4 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=1512cf1a20070d45f764ecddb2d9620fbc374a49;p=vlc Use QPointer and QMutexLocker so we don't crash at Qt4 interface exit --- diff --git a/modules/gui/qt4/qt4.cpp b/modules/gui/qt4/qt4.cpp index e349b70b6f..42565b8439 100644 --- a/modules/gui/qt4/qt4.cpp +++ b/modules/gui/qt4/qt4.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include "qt4.hpp" #include "dialogs_provider.hpp" @@ -340,7 +341,7 @@ static void Init( intf_thread_t *p_intf ) p_mi->show(); */ p_intf->p_sys->b_isDialogProvider = false; - val.p_address = p_intf->p_sys->p_mi; + val.p_address = new QPointer (p_intf->p_sys->p_mi); QMutexLocker locker (&windowLock); var_Set (p_intf, "window_widget", val); windowWait.wakeAll (); @@ -481,29 +482,41 @@ static int OpenWindow (vlc_object_t *obj) windowWait.wait (&windowLock); } - MainInterface *mi = (MainInterface *)ptrval.p_address; - msg_Dbg (obj, "requesting window (%p)...", mi); + msg_Dbg (obj, "requesting window..."); + QPointer *miP = (QPointer *)ptrval.p_address; + ptrval.p_address = NULL; + /* take ownership */ + var_Set (intf, "window_widget", ptrval); + vlc_object_release (intf); + + if (miP->isNull ()) + return VLC_EGENERIC; - wnd->handle = mi->requestVideo (wnd->vout, &wnd->pos_x, &wnd->pos_y, - &wnd->width, &wnd->height); + wnd->handle = (*miP)->requestVideo (wnd->vout, &wnd->pos_x, &wnd->pos_y, + &wnd->width, &wnd->height); windowLock.unlock (); wnd->control = ControlWindow; - wnd->p_private = intf; + wnd->p_private = miP; return VLC_SUCCESS; } static int ControlWindow (vout_window_t *wnd, int query, va_list args) { - intf_thread_t *intf = (intf_thread_t *)wnd->p_private; - intf->p_sys->p_mi->controlVideo (wnd->handle, query, args); + QPointer *miP = (QPointer *)wnd->p_private; + QMutexLocker locker (&windowLock); + + if (miP->isNull ()) + return VLC_EGENERIC; + return (*miP)->controlVideo (wnd->handle, query, args); } static void CloseWindow (vlc_object_t *obj) { vout_window_t *wnd = (vout_window_t *)obj; - intf_thread_t *intf = (intf_thread_t *)obj->p_private; + QPointer *miP = (QPointer *)wnd->p_private; + QMutexLocker locker (&windowLock); - intf->p_sys->p_mi->releaseVideo (wnd->handle); - vlc_object_release (intf); + if (!miP->isNull ()) + (*miP)->releaseVideo (wnd->handle); + delete miP; } -