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
b8acb755
Commit
b8acb755
authored
Nov 28, 2007
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix screensaver deadlock if terminating as soon the interface is created - closes #1363
parent
cddeb8e7
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
43 additions
and
4 deletions
+43
-4
include/vlc_objects.h
include/vlc_objects.h
+10
-2
modules/misc/screensaver.c
modules/misc/screensaver.c
+2
-2
src/libvlc.sym
src/libvlc.sym
+1
-0
src/misc/objects.c
src/misc/objects.c
+30
-0
No files found.
include/vlc_objects.h
View file @
b8acb755
...
@@ -153,13 +153,17 @@ VLC_EXPORT( vlc_bool_t, __vlc_object_wait, ( vlc_object_t * ) );
...
@@ -153,13 +153,17 @@ VLC_EXPORT( vlc_bool_t, __vlc_object_wait, ( vlc_object_t * ) );
#define vlc_object_wait( obj ) \
#define vlc_object_wait( obj ) \
__vlc_object_wait( VLC_OBJECT( obj ) )
__vlc_object_wait( VLC_OBJECT( obj ) )
/* NOTE: this function is a *temporary* convenience.
* See the vlc_object_alive() documentation for a better alternative.
*/
static
inline
static
inline
vlc_bool_t
__vlc_object_lock_and_wait
(
vlc_object_t
*
obj
)
vlc_bool_t
__vlc_object_lock_and_wait
(
vlc_object_t
*
obj
)
{
{
vlc_bool_t
b
;
vlc_bool_t
b
=
VLC_TRUE
;
vlc_object_lock
(
obj
);
vlc_object_lock
(
obj
);
b
=
obj
->
b_die
?
VLC_TRUE
:
vlc_object_wait
(
obj
);
if
(
vlc_object_alive
(
obj
)
)
b
=
vlc_object_wait
(
obj
);
vlc_object_unlock
(
obj
);
vlc_object_unlock
(
obj
);
return
b
;
return
b
;
}
}
...
@@ -187,4 +191,8 @@ VLC_EXPORT( void, __vlc_object_kill, ( vlc_object_t * ) );
...
@@ -187,4 +191,8 @@ VLC_EXPORT( void, __vlc_object_kill, ( vlc_object_t * ) );
#define vlc_object_kill(a) \
#define vlc_object_kill(a) \
__vlc_object_kill( VLC_OBJECT(a) )
__vlc_object_kill( VLC_OBJECT(a) )
VLC_EXPORT
(
vlc_bool_t
,
__vlc_object_alive
,
(
vlc_object_t
*
)
);
#define vlc_object_alive(a) \
__vlc_object_alive( VLC_OBJECT(a) )
int
vlc_object_waitpipe
(
vlc_object_t
*
obj
);
int
vlc_object_waitpipe
(
vlc_object_t
*
obj
);
modules/misc/screensaver.c
View file @
b8acb755
...
@@ -171,13 +171,13 @@ static void Run( intf_thread_t *p_intf )
...
@@ -171,13 +171,13 @@ static void Run( intf_thread_t *p_intf )
p_intf
->
p_sys
->
p_connection
=
dbus_init
(
p_intf
);
p_intf
->
p_sys
->
p_connection
=
dbus_init
(
p_intf
);
#endif
#endif
for
(;;
)
while
(
vlc_object_alive
(
p_intf
)
)
{
{
vlc_object_t
*
p_vout
;
vlc_object_t
*
p_vout
;
/* Check screensaver every 30 seconds */
/* Check screensaver every 30 seconds */
if
(
vlc_object_timedwait
(
p_intf
,
mdate
()
+
30000000
)
<
0
)
if
(
vlc_object_timedwait
(
p_intf
,
mdate
()
+
30000000
)
<
0
)
break
;
continue
;
p_vout
=
vlc_object_find
(
p_intf
,
VLC_OBJECT_VOUT
,
FIND_ANYWHERE
);
p_vout
=
vlc_object_find
(
p_intf
,
VLC_OBJECT_VOUT
,
FIND_ANYWHERE
);
...
...
src/libvlc.sym
View file @
b8acb755
...
@@ -17,6 +17,7 @@ NTPtime64
...
@@ -17,6 +17,7 @@ NTPtime64
__str_format
__str_format
path_sanitize
path_sanitize
__vlc_object_kill
__vlc_object_kill
__vlc_object_alive
vlc_b64_encode
vlc_b64_encode
__net_Connect
__net_Connect
__net_ConnectDgram
__net_ConnectDgram
...
...
src/misc/objects.c
View file @
b8acb755
...
@@ -552,6 +552,36 @@ int __vlc_object_timedwait( vlc_object_t *obj, mtime_t deadline )
...
@@ -552,6 +552,36 @@ int __vlc_object_timedwait( vlc_object_t *obj, mtime_t deadline )
}
}
/**
* Checks whether an object has been "killed".
* The object lock must be held.
*
* Typical code for an object thread could be:
*
vlc_object_lock (self);
...initialization...
while (vlc_object_alive (self))
{
...preprocessing...
if (vlc_object_wait (self))
continue;
...postprocessing...
}
...deinitialization...
vlc_object_unlock (self);
*
*
* @return true iff the object has not been killed yet
*/
vlc_bool_t
__vlc_object_alive
(
vlc_object_t
*
obj
)
{
vlc_assert_locked
(
&
obj
->
object_lock
);
return
!
obj
->
b_die
;
}
/**
/**
* Signals an object for which the lock is held.
* Signals an object for which the lock is held.
*/
*/
...
...
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