[vlc-devel] commit: Hildon: partially fix vout window provider thread safety ( Rémi Denis-Courmont )
git version control
git at videolan.org
Thu Oct 1 21:37:05 CEST 2009
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Oct 1 22:34:46 2009 +0300| [b7cce6162b70361cc1d4078cdcf133118d1733e9] | committer: Rémi Denis-Courmont
Hildon: partially fix vout window provider thread safety
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b7cce6162b70361cc1d4078cdcf133118d1733e9
---
modules/gui/maemo/maemo.c | 55 +++++++++++++++++++++++---------------------
modules/gui/maemo/maemo.h | 2 -
2 files changed, 29 insertions(+), 28 deletions(-)
diff --git a/modules/gui/maemo/maemo.c b/modules/gui/maemo/maemo.c
index d884c74..3b12943 100644
--- a/modules/gui/maemo/maemo.c
+++ b/modules/gui/maemo/maemo.c
@@ -74,6 +74,14 @@ vlc_module_begin();
set_callbacks( OpenWindow, CloseWindow );
vlc_module_end();
+static struct
+{
+ vlc_mutex_t lock;
+ vlc_cond_t wait;
+ intf_thread_t *intf;
+ bool enabled;
+} wnd_req = { VLC_STATIC_MUTEX, PTHREAD_COND_INITIALIZER, NULL, false };
+
/*****************************************************************************
* Module callbacks
*****************************************************************************/
@@ -95,9 +103,9 @@ static int Open( vlc_object_t *p_this )
p_intf->p_sys->p_main_window = NULL;
p_intf->p_sys->p_video_window = NULL;
+ wnd_req.enabled = true;
+ /* ^no need to lock, interfacesare started before video outputs */
vlc_spin_init( &p_intf->p_sys->event_lock );
- vlc_mutex_init( &p_intf->p_sys->p_video_mutex );
- vlc_cond_init( &p_intf->p_sys->p_video_cond );
return VLC_SUCCESS;
}
@@ -246,6 +254,7 @@ static void Run( intf_thread_t *p_intf )
var_DelCallback( p_intf->p_sys->p_playlist, "activity",
activity_cb, p_intf );
+ /* FIXME: we need to wait for vout to clean up... */
assert( !p_intf->p_sys->p_vout ); /* too late */
gtk_object_destroy( GTK_OBJECT( window ) );
}
@@ -264,27 +273,27 @@ static gboolean should_die( gpointer data )
static int OpenWindow (vlc_object_t *obj)
{
vout_window_t *wnd = (vout_window_t *)obj;
+ intf_thread_t *intf;
- if (wnd->cfg->is_standalone)
+ if (wnd->cfg->is_standalone || !wnd_req.enabled)
return VLC_EGENERIC;
- intf_thread_t *intf = (intf_thread_t*)vlc_object_find_name (obj, "maemo", FIND_ANYWHERE);
- if (intf == NULL)
- {
- msg_Err( obj, "Maemo interface not found" );
- return VLC_EGENERIC; /* Maemo not in use */
- }
-
/* FIXME it should NOT be needed */
vout_thread_t *vout = vlc_object_find (obj, VLC_OBJECT_VOUT, FIND_PARENT);
+ if (!vout)
+ return VLC_EGENERIC;
+
+ vlc_mutex_lock (&wnd_req.lock);
+ while ((intf = wnd_req.intf) == NULL)
+ vlc_cond_wait (&wnd_req.wait, &wnd_req.lock);
wnd->handle.xid = request_video( intf, vout );
+ vlc_mutex_unlock (&wnd_req.lock);
+
+ vlc_object_release( vout );
+
if (!wnd->handle.xid)
- {
- vlc_object_release( vout );
return VLC_EGENERIC;
- }
- vlc_object_release( vout );
msg_Dbg( intf, "Using handle %"PRIu32, wnd->handle.xid );
@@ -322,8 +331,9 @@ static void CloseWindow (vlc_object_t *obj)
vout_window_t *wnd = (vout_window_t *)obj;
intf_thread_t *intf = (intf_thread_t *)wnd->sys;
+ vlc_mutex_lock( &wnd_req.lock );
release_video( intf );
- vlc_object_release (intf);
+ vlc_mutex_unlock( &wnd_req.lock );
}
static uint32_t request_video( intf_thread_t *p_intf, vout_thread_t *p_nvout )
@@ -334,16 +344,6 @@ static uint32_t request_video( intf_thread_t *p_intf, vout_thread_t *p_nvout )
return 0;
}
- vlc_mutex_lock( &p_intf->p_sys->p_video_mutex );
- mutex_cleanup_push( &p_intf->p_sys->p_video_mutex );
-
- // We wait until the p_video_window is set
- while( p_intf->p_sys->p_video_window == NULL )
- vlc_cond_wait( &p_intf->p_sys->p_video_cond,
- &p_intf->p_sys->p_video_mutex );
-
- vlc_cleanup_run();
-
p_intf->p_sys->p_vout = vlc_object_hold( p_nvout );
return GDK_WINDOW_XID( p_intf->p_sys->p_video_window->window );
}
@@ -368,7 +368,10 @@ static gboolean video_widget_ready( gpointer data )
p_intf->p_sys->p_video_window = video;
gtk_widget_grab_focus( video );
- vlc_cond_signal( &p_intf->p_sys->p_video_cond );
+ vlc_mutex_lock( &wnd_req.lock );
+ wnd_req.intf = p_intf;
+ vlc_cond_signal( &wnd_req.wait );
+ vlc_mutex_unlock( &wnd_req.lock );
// We rewind the input
if( p_intf->p_sys->p_input )
diff --git a/modules/gui/maemo/maemo.h b/modules/gui/maemo/maemo.h
index 011a81b..7814dfc 100644
--- a/modules/gui/maemo/maemo.h
+++ b/modules/gui/maemo/maemo.h
@@ -47,6 +47,4 @@ struct intf_sys_t
GtkWidget *p_video_window;
vout_thread_t *p_vout;
- vlc_cond_t p_video_cond;
- vlc_mutex_t p_video_mutex;
};
More information about the vlc-devel
mailing list