Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
b7cce616
Commit
b7cce616
authored
Oct 01, 2009
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Hildon: partially fix vout window provider thread safety
parent
ae57a467
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
29 additions
and
28 deletions
+29
-28
modules/gui/maemo/maemo.c
modules/gui/maemo/maemo.c
+29
-26
modules/gui/maemo/maemo.h
modules/gui/maemo/maemo.h
+0
-2
No files found.
modules/gui/maemo/maemo.c
View file @
b7cce616
...
@@ -74,6 +74,14 @@ vlc_module_begin();
...
@@ -74,6 +74,14 @@ vlc_module_begin();
set_callbacks
(
OpenWindow
,
CloseWindow
);
set_callbacks
(
OpenWindow
,
CloseWindow
);
vlc_module_end
();
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
* Module callbacks
*****************************************************************************/
*****************************************************************************/
...
@@ -95,9 +103,9 @@ static int Open( vlc_object_t *p_this )
...
@@ -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_main_window
=
NULL
;
p_intf
->
p_sys
->
p_video_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_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
;
return
VLC_SUCCESS
;
}
}
...
@@ -246,6 +254,7 @@ static void Run( intf_thread_t *p_intf )
...
@@ -246,6 +254,7 @@ static void Run( intf_thread_t *p_intf )
var_DelCallback
(
p_intf
->
p_sys
->
p_playlist
,
"activity"
,
var_DelCallback
(
p_intf
->
p_sys
->
p_playlist
,
"activity"
,
activity_cb
,
p_intf
);
activity_cb
,
p_intf
);
/* FIXME: we need to wait for vout to clean up... */
assert
(
!
p_intf
->
p_sys
->
p_vout
);
/* too late */
assert
(
!
p_intf
->
p_sys
->
p_vout
);
/* too late */
gtk_object_destroy
(
GTK_OBJECT
(
window
)
);
gtk_object_destroy
(
GTK_OBJECT
(
window
)
);
}
}
...
@@ -264,27 +273,27 @@ static gboolean should_die( gpointer data )
...
@@ -264,27 +273,27 @@ static gboolean should_die( gpointer data )
static
int
OpenWindow
(
vlc_object_t
*
obj
)
static
int
OpenWindow
(
vlc_object_t
*
obj
)
{
{
vout_window_t
*
wnd
=
(
vout_window_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
;
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 */
/* FIXME it should NOT be needed */
vout_thread_t
*
vout
=
vlc_object_find
(
obj
,
VLC_OBJECT_VOUT
,
FIND_PARENT
);
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
);
wnd
->
handle
.
xid
=
request_video
(
intf
,
vout
);
if
(
!
wnd
->
handle
.
xid
)
vlc_mutex_unlock
(
&
wnd_req
.
lock
);
{
vlc_object_release
(
vout
);
vlc_object_release
(
vout
);
if
(
!
wnd
->
handle
.
xid
)
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
vlc_object_release
(
vout
);
msg_Dbg
(
intf
,
"Using handle %"
PRIu32
,
wnd
->
handle
.
xid
);
msg_Dbg
(
intf
,
"Using handle %"
PRIu32
,
wnd
->
handle
.
xid
);
...
@@ -322,8 +331,9 @@ static void CloseWindow (vlc_object_t *obj)
...
@@ -322,8 +331,9 @@ static void CloseWindow (vlc_object_t *obj)
vout_window_t
*
wnd
=
(
vout_window_t
*
)
obj
;
vout_window_t
*
wnd
=
(
vout_window_t
*
)
obj
;
intf_thread_t
*
intf
=
(
intf_thread_t
*
)
wnd
->
sys
;
intf_thread_t
*
intf
=
(
intf_thread_t
*
)
wnd
->
sys
;
vlc_mutex_lock
(
&
wnd_req
.
lock
);
release_video
(
intf
);
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
)
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 )
...
@@ -334,16 +344,6 @@ static uint32_t request_video( intf_thread_t *p_intf, vout_thread_t *p_nvout )
return
0
;
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
);
p_intf
->
p_sys
->
p_vout
=
vlc_object_hold
(
p_nvout
);
return
GDK_WINDOW_XID
(
p_intf
->
p_sys
->
p_video_window
->
window
);
return
GDK_WINDOW_XID
(
p_intf
->
p_sys
->
p_video_window
->
window
);
}
}
...
@@ -368,7 +368,10 @@ static gboolean video_widget_ready( gpointer data )
...
@@ -368,7 +368,10 @@ static gboolean video_widget_ready( gpointer data )
p_intf
->
p_sys
->
p_video_window
=
video
;
p_intf
->
p_sys
->
p_video_window
=
video
;
gtk_widget_grab_focus
(
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
// We rewind the input
if
(
p_intf
->
p_sys
->
p_input
)
if
(
p_intf
->
p_sys
->
p_input
)
...
...
modules/gui/maemo/maemo.h
View file @
b7cce616
...
@@ -47,6 +47,4 @@ struct intf_sys_t
...
@@ -47,6 +47,4 @@ struct intf_sys_t
GtkWidget
*
p_video_window
;
GtkWidget
*
p_video_window
;
vout_thread_t
*
p_vout
;
vout_thread_t
*
p_vout
;
vlc_cond_t
p_video_cond
;
vlc_mutex_t
p_video_mutex
;
};
};
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment