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
a9e4de11
Commit
a9e4de11
authored
Aug 18, 2007
by
Damien Fouilleul
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
threads: win32, make sure only object owning a thread can close its handle when object is destroyed
parent
1144af45
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
71 additions
and
58 deletions
+71
-58
include/vlc_threads.h
include/vlc_threads.h
+11
-2
src/misc/objects.c
src/misc/objects.c
+10
-0
src/misc/threads.c
src/misc/threads.c
+50
-52
src/video_output/video_output.c
src/video_output/video_output.c
+0
-4
No files found.
include/vlc_threads.h
View file @
a9e4de11
...
@@ -166,9 +166,18 @@ typedef struct
...
@@ -166,9 +166,18 @@ typedef struct
}
vlc_threadvar_t
;
}
vlc_threadvar_t
;
#elif defined( WIN32 ) || defined( UNDER_CE )
#elif defined( WIN32 ) || defined( UNDER_CE )
typedef
HANDLE
vlc_thread_t
;
typedef
struct
{
/* thread id */
DWORD
id
;
/*
** handle to created thread, needs be closed to dispose of it
** even after thread has exited
*/
HANDLE
hThread
;
}
vlc_thread_t
;
typedef
BOOL
(
WINAPI
*
SIGNALOBJECTANDWAIT
)
(
HANDLE
,
HANDLE
,
DWORD
,
BOOL
);
typedef
BOOL
(
WINAPI
*
SIGNALOBJECTANDWAIT
)
(
HANDLE
,
HANDLE
,
DWORD
,
BOOL
);
typedef
unsigned
(
WINAPI
*
PTHREAD_START
)
(
void
*
);
typedef
struct
typedef
struct
{
{
...
...
src/misc/objects.c
View file @
a9e4de11
...
@@ -425,6 +425,12 @@ void __vlc_object_destroy( vlc_object_t *p_this )
...
@@ -425,6 +425,12 @@ void __vlc_object_destroy( vlc_object_t *p_this )
vlc_mutex_unlock
(
&
structure_lock
);
vlc_mutex_unlock
(
&
structure_lock
);
}
}
#if defined(WIN32) || defined(UNDER_CE)
/* if object has an associated thread, close it now */
if
(
p_priv
->
thread_id
.
hThread
)
CloseHandle
(
p_priv
->
thread_id
.
hThread
);
#endif
vlc_mutex_destroy
(
&
p_this
->
object_lock
);
vlc_mutex_destroy
(
&
p_this
->
object_lock
);
vlc_cond_destroy
(
&
p_this
->
object_wait
);
vlc_cond_destroy
(
&
p_this
->
object_wait
);
...
@@ -1209,7 +1215,11 @@ static void PrintObject( vlc_object_t *p_this, const char *psz_prefix )
...
@@ -1209,7 +1215,11 @@ static void PrintObject( vlc_object_t *p_this, const char *psz_prefix )
psz_thread
[
0
]
=
'\0'
;
psz_thread
[
0
]
=
'\0'
;
if
(
p_this
->
p_internals
->
b_thread
)
if
(
p_this
->
p_internals
->
b_thread
)
snprintf
(
psz_thread
,
29
,
" (thread %u)"
,
snprintf
(
psz_thread
,
29
,
" (thread %u)"
,
#if defined(WIN32) || defined(UNDER_CE)
(
unsigned
)
p_this
->
p_internals
->
thread_id
.
id
);
#else
(
unsigned
)
p_this
->
p_internals
->
thread_id
);
(
unsigned
)
p_this
->
p_internals
->
thread_id
);
#endif
psz_parent
[
0
]
=
'\0'
;
psz_parent
[
0
]
=
'\0'
;
if
(
p_this
->
p_parent
)
if
(
p_this
->
p_parent
)
...
...
src/misc/threads.c
View file @
a9e4de11
...
@@ -552,29 +552,6 @@ int __vlc_threadvar_create( vlc_object_t *p_this, vlc_threadvar_t *p_tls )
...
@@ -552,29 +552,6 @@ int __vlc_threadvar_create( vlc_object_t *p_this, vlc_threadvar_t *p_tls )
return
i_ret
;
return
i_ret
;
}
}
#if defined( WIN32 ) || defined( UNDER_CE )
/*
** Use a wrapper function which will make sure that
** thread handle is closed
*/
struct
_vlc_win32_init_thread_data
{
void
*
(
*
func
)
(
void
*
);
void
*
p_data
;
};
static
unsigned
WINAPI
__vlc_win32_thread_start
(
void
*
p_data
)
{
struct
_vlc_win32_init_thread_data
*
p_win32data
=
(
struct
_vlc_win32_init_thread_data
*
)
p_data
;
vlc_object_t
*
p_this
=
(
vlc_object_t
*
)
p_win32data
->
p_data
;
HANDLE
hThread
=
(
HANDLE
)
p_this
->
p_internals
->
thread_id
;
void
*
retval
=
(
*
p_win32data
->
func
)((
LPVOID
)
p_this
);
CloseHandle
(
hThread
);
return
(
unsigned
)
retval
;
}
#endif
/*****************************************************************************
/*****************************************************************************
* vlc_thread_create: create a thread, inner version
* vlc_thread_create: create a thread, inner version
*****************************************************************************
*****************************************************************************
...
@@ -588,9 +565,6 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
...
@@ -588,9 +565,6 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
int
i_ret
;
int
i_ret
;
void
*
p_data
=
(
void
*
)
p_this
;
void
*
p_data
=
(
void
*
)
p_this
;
vlc_object_internals_t
*
p_priv
=
p_this
->
p_internals
;
vlc_object_internals_t
*
p_priv
=
p_this
->
p_internals
;
#if defined( WIN32 ) || defined( UNDER_CE )
struct
_vlc_win32_init_thread_data
win32data
=
{
func
,
p_data
};
#endif
vlc_mutex_lock
(
&
p_this
->
object_lock
);
vlc_mutex_lock
(
&
p_this
->
object_lock
);
...
@@ -604,32 +578,38 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
...
@@ -604,32 +578,38 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
#elif defined( WIN32 ) || defined( UNDER_CE )
#elif defined( WIN32 ) || defined( UNDER_CE )
{
{
unsigned
threadID
;
/* When using the MSVCRT C library you have to use the _beginthreadex
/* When using the MSVCRT C library you have to use the _beginthreadex
* function instead of CreateThread, otherwise you'll end up with
* function instead of CreateThread, otherwise you'll end up with
* memory leaks and the signal functions not working (see Microsoft
* memory leaks and the signal functions not working (see Microsoft
* Knowledge Base, article 104641) */
* Knowledge Base, article 104641) */
#if defined( UNDER_CE )
#if defined( UNDER_CE )
HANDLE
hThread
=
CreateThread
(
NULL
,
0
,
__vlc_win32_thread_start
,
DWORD
threadId
;
(
LPVOID
)
&
win32data
,
0
,
&
threadID
);
HANDLE
hThread
=
CreateThread
(
NULL
,
0
,
(
LPTHREAD_START_ROUTINE
)
func
,
(
LPVOID
)
p_data
,
CREATE_SUSPENDED
,
&
threadId
);
#else
#else
uintptr_t
hThread
=
_beginthreadex
(
NULL
,
0
,
__vlc_win32_thread_start
,
unsigned
threadId
;
(
void
*
)
&
win32data
,
0
,
&
threadID
);
uintptr_t
hThread
=
_beginthreadex
(
NULL
,
0
,
(
LPTHREAD_START_ROUTINE
)
func
,
(
void
*
)
p_data
,
CREATE_SUSPENDED
,
&
threadId
);
#endif
#endif
p_priv
->
thread_id
=
(
HANDLE
)
hThread
;
p_priv
->
thread_id
.
id
=
(
DWORD
)
threadId
;
p_priv
->
thread_id
.
hThread
=
(
HANDLE
)
hThread
;
ResumeThread
((
HANDLE
)
hThread
);
}
}
if
(
p_priv
->
thread_id
&&
i_priority
)
i_ret
=
(
p_priv
->
thread_id
.
hThread
?
0
:
1
);
if
(
i_ret
&&
i_priority
)
{
{
if
(
!
SetThreadPriority
(
p_priv
->
thread_id
,
i_priority
)
)
if
(
!
SetThreadPriority
(
p_priv
->
thread_id
.
hThread
,
i_priority
)
)
{
{
msg_Warn
(
p_this
,
"couldn't set a faster priority"
);
msg_Warn
(
p_this
,
"couldn't set a faster priority"
);
i_priority
=
0
;
i_priority
=
0
;
}
}
}
}
i_ret
=
(
p_priv
->
thread_id
?
0
:
1
);
#elif defined( HAVE_KERNEL_SCHEDULER_H )
#elif defined( HAVE_KERNEL_SCHEDULER_H )
p_priv
->
thread_id
=
spawn_thread
(
(
thread_func
)
func
,
psz_name
,
p_priv
->
thread_id
=
spawn_thread
(
(
thread_func
)
func
,
psz_name
,
i_priority
,
p_data
);
i_priority
,
p_data
);
...
@@ -691,9 +671,16 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
...
@@ -691,9 +671,16 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
p_priv
->
b_thread
=
VLC_TRUE
;
p_priv
->
b_thread
=
VLC_TRUE
;
#if defined( WIN32 ) || defined( UNDER_CE )
msg_Dbg
(
p_this
,
"thread %u (%s) created at priority %d (%s:%d)"
,
(
unsigned
int
)
p_priv
->
thread_id
.
id
,
psz_name
,
i_priority
,
psz_file
,
i_line
);
#else
msg_Dbg
(
p_this
,
"thread %u (%s) created at priority %d (%s:%d)"
,
msg_Dbg
(
p_this
,
"thread %u (%s) created at priority %d (%s:%d)"
,
(
unsigned
int
)
p_priv
->
thread_id
,
psz_name
,
i_priority
,
(
unsigned
int
)
p_priv
->
thread_id
,
psz_name
,
i_priority
,
psz_file
,
i_line
);
psz_file
,
i_line
);
#endif
vlc_mutex_unlock
(
&
p_this
->
object_lock
);
vlc_mutex_unlock
(
&
p_this
->
object_lock
);
}
}
...
@@ -717,9 +704,9 @@ int __vlc_thread_set_priority( vlc_object_t *p_this, const char * psz_file,
...
@@ -717,9 +704,9 @@ int __vlc_thread_set_priority( vlc_object_t *p_this, const char * psz_file,
vlc_object_internals_t
*
p_priv
=
p_this
->
p_internals
;
vlc_object_internals_t
*
p_priv
=
p_this
->
p_internals
;
#if defined( PTH_INIT_IN_PTH_H ) || defined( ST_INIT_IN_ST_H )
#if defined( PTH_INIT_IN_PTH_H ) || defined( ST_INIT_IN_ST_H )
#elif defined( WIN32 ) || defined( UNDER_CE )
#elif defined( WIN32 ) || defined( UNDER_CE )
if
(
!
p_priv
->
thread_id
)
if
(
!
p_priv
->
thread_id
.
hThread
)
p_priv
->
thread_id
=
GetCurrentThread
();
p_priv
->
thread_id
.
hThread
=
GetCurrentThread
();
if
(
!
SetThreadPriority
(
(
HANDLE
)
p_priv
->
thread_i
d
,
i_priority
)
)
if
(
!
SetThreadPriority
(
p_priv
->
thread_id
.
hThrea
d
,
i_priority
)
)
{
{
msg_Warn
(
p_this
,
"couldn't set a faster priority"
);
msg_Warn
(
p_this
,
"couldn't set a faster priority"
);
return
1
;
return
1
;
...
@@ -779,15 +766,8 @@ void __vlc_thread_ready( vlc_object_t *p_this )
...
@@ -779,15 +766,8 @@ void __vlc_thread_ready( vlc_object_t *p_this )
void
__vlc_thread_join
(
vlc_object_t
*
p_this
,
const
char
*
psz_file
,
int
i_line
)
void
__vlc_thread_join
(
vlc_object_t
*
p_this
,
const
char
*
psz_file
,
int
i_line
)
{
{
vlc_object_internals_t
*
p_priv
=
p_this
->
p_internals
;
vlc_object_internals_t
*
p_priv
=
p_this
->
p_internals
;
int
i_ret
=
0
;
#if defined( PTH_INIT_IN_PTH_H )
#if defined( UNDER_CE ) || defined( WIN32 )
i_ret
=
(
pth_join
(
p_priv
->
thread_id
,
NULL
)
==
FALSE
);
#elif defined( ST_INIT_IN_ST_H )
i_ret
=
st_thread_join
(
p_priv
->
thread_id
,
NULL
);
#elif defined( UNDER_CE ) || defined( WIN32 )
HMODULE
hmodule
;
HMODULE
hmodule
;
BOOL
(
WINAPI
*
OurGetThreadTimes
)(
HANDLE
,
FILETIME
*
,
FILETIME
*
,
BOOL
(
WINAPI
*
OurGetThreadTimes
)(
HANDLE
,
FILETIME
*
,
FILETIME
*
,
FILETIME
*
,
FILETIME
*
);
FILETIME
*
,
FILETIME
*
);
...
@@ -795,9 +775,12 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line
...
@@ -795,9 +775,12 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line
int64_t
real_time
,
kernel_time
,
user_time
;
int64_t
real_time
,
kernel_time
,
user_time
;
HANDLE
hThread
;
HANDLE
hThread
;
/* thread will destroy its own handle on exit, duplicate it here */
/*
** object will close its thread handle when destroyed, duplicate it here
** to be on the safe side
*/
if
(
!
DuplicateHandle
(
GetCurrentProcess
(),
if
(
!
DuplicateHandle
(
GetCurrentProcess
(),
(
HANDLE
)
p_priv
->
thread_i
d
,
p_priv
->
thread_id
.
hThrea
d
,
GetCurrentProcess
(),
GetCurrentProcess
(),
&
hThread
,
&
hThread
,
0
,
0
,
...
@@ -805,14 +788,17 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line
...
@@ -805,14 +788,17 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line
DUPLICATE_SAME_ACCESS
)
)
DUPLICATE_SAME_ACCESS
)
)
{
{
msg_Err
(
p_this
,
"thread_join(%u) failed at %s:%d (%s)"
,
msg_Err
(
p_this
,
"thread_join(%u) failed at %s:%d (%s)"
,
(
unsigned
int
)
p_priv
->
thread_id
,
psz_file
,
i_line
,
(
unsigned
int
)
p_priv
->
thread_id
.
id
,
GetLastError
()
);
psz_file
,
i_line
,
GetLastError
()
);
p_priv
->
b_thread
=
VLC_FALSE
;
p_priv
->
b_thread
=
VLC_FALSE
;
return
;
return
;
}
}
WaitForSingleObject
(
hThread
,
INFINITE
);
WaitForSingleObject
(
hThread
,
INFINITE
);
msg_Dbg
(
p_this
,
"thread %u joined (%s:%d)"
,
(
unsigned
int
)
p_priv
->
thread_id
.
id
,
psz_file
,
i_line
);
#if defined( UNDER_CE )
#if defined( UNDER_CE )
hmodule
=
GetModuleHandle
(
_T
(
"COREDLL"
)
);
hmodule
=
GetModuleHandle
(
_T
(
"COREDLL"
)
);
#else
#else
...
@@ -850,9 +836,19 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line
...
@@ -850,9 +836,19 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line
}
}
CloseHandle
(
hThread
);
CloseHandle
(
hThread
);
#else
/* !defined(WIN32) */
int
i_ret
=
0
;
#if defined( PTH_INIT_IN_PTH_H )
i_ret
=
(
pth_join
(
p_priv
->
thread_id
,
NULL
)
==
FALSE
);
#elif defined( ST_INIT_IN_ST_H )
i_ret
=
st_thread_join
(
p_priv
->
thread_id
,
NULL
);
#elif defined( HAVE_KERNEL_SCHEDULER_H )
#elif defined( HAVE_KERNEL_SCHEDULER_H )
int32_t
exit_value
;
int32_t
exit_value
;
wait_for_thread
(
p_priv
->
thread_id
,
&
exit_value
);
i_ret
=
(
B_OK
==
wait_for_thread
(
p_priv
->
thread_id
,
&
exit_value
)
);
#elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
#elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
i_ret
=
pthread_join
(
p_priv
->
thread_id
,
NULL
);
i_ret
=
pthread_join
(
p_priv
->
thread_id
,
NULL
);
...
@@ -875,6 +871,8 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line
...
@@ -875,6 +871,8 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line
(
unsigned
int
)
p_priv
->
thread_id
,
psz_file
,
i_line
);
(
unsigned
int
)
p_priv
->
thread_id
,
psz_file
,
i_line
);
}
}
#endif
p_priv
->
b_thread
=
VLC_FALSE
;
p_priv
->
b_thread
=
VLC_FALSE
;
}
}
src/video_output/video_output.c
View file @
a9e4de11
...
@@ -1448,10 +1448,6 @@ static void SuxorRestartVideoES( suxor_thread_t *p_this )
...
@@ -1448,10 +1448,6 @@ static void SuxorRestartVideoES( suxor_thread_t *p_this )
vlc_object_release
(
p_this
->
p_input
);
vlc_object_release
(
p_this
->
p_input
);
#ifdef WIN32
CloseHandle
(
p_this
->
p_internals
->
thread_id
);
#endif
vlc_object_destroy
(
p_this
);
vlc_object_destroy
(
p_this
);
}
}
...
...
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