Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
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-2-2
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
}
vlc_threadvar_t
;
#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
unsigned
(
WINAPI
*
PTHREAD_START
)
(
void
*
);
typedef
struct
{
...
...
src/misc/objects.c
View file @
a9e4de11
...
...
@@ -425,6 +425,12 @@ void __vlc_object_destroy( vlc_object_t *p_this )
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_cond_destroy
(
&
p_this
->
object_wait
);
...
...
@@ -1209,7 +1215,11 @@ static void PrintObject( vlc_object_t *p_this, const char *psz_prefix )
psz_thread
[
0
]
=
'\0'
;
if
(
p_this
->
p_internals
->
b_thread
)
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
);
#endif
psz_parent
[
0
]
=
'\0'
;
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 )
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
*****************************************************************************
...
...
@@ -588,9 +565,6 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
int
i_ret
;
void
*
p_data
=
(
void
*
)
p_this
;
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
);
...
...
@@ -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 )
{
unsigned
threadID
;
/* When using the MSVCRT C library you have to use the _beginthreadex
* function instead of CreateThread, otherwise you'll end up with
* memory leaks and the signal functions not working (see Microsoft
* Knowledge Base, article 104641) */
#if defined( UNDER_CE )
HANDLE
hThread
=
CreateThread
(
NULL
,
0
,
__vlc_win32_thread_start
,
(
LPVOID
)
&
win32data
,
0
,
&
threadID
);
DWORD
threadId
;
HANDLE
hThread
=
CreateThread
(
NULL
,
0
,
(
LPTHREAD_START_ROUTINE
)
func
,
(
LPVOID
)
p_data
,
CREATE_SUSPENDED
,
&
threadId
);
#else
uintptr_t
hThread
=
_beginthreadex
(
NULL
,
0
,
__vlc_win32_thread_start
,
(
void
*
)
&
win32data
,
0
,
&
threadID
);
unsigned
threadId
;
uintptr_t
hThread
=
_beginthreadex
(
NULL
,
0
,
(
LPTHREAD_START_ROUTINE
)
func
,
(
void
*
)
p_data
,
CREATE_SUSPENDED
,
&
threadId
);
#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"
);
i_priority
=
0
;
}
}
i_ret
=
(
p_priv
->
thread_id
?
0
:
1
);
#elif defined( HAVE_KERNEL_SCHEDULER_H )
p_priv
->
thread_id
=
spawn_thread
(
(
thread_func
)
func
,
psz_name
,
i_priority
,
p_data
);
...
...
@@ -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
;
#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)"
,
(
unsigned
int
)
p_priv
->
thread_id
,
psz_name
,
i_priority
,
psz_file
,
i_line
);
#endif
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,
vlc_object_internals_t
*
p_priv
=
p_this
->
p_internals
;
#if defined( PTH_INIT_IN_PTH_H ) || defined( ST_INIT_IN_ST_H )
#elif defined( WIN32 ) || defined( UNDER_CE )
if
(
!
p_priv
->
thread_id
)
p_priv
->
thread_id
=
GetCurrentThread
();
if
(
!
SetThreadPriority
(
(
HANDLE
)
p_priv
->
thread_i
d
,
i_priority
)
)
if
(
!
p_priv
->
thread_id
.
hThread
)
p_priv
->
thread_id
.
hThread
=
GetCurrentThread
();
if
(
!
SetThreadPriority
(
p_priv
->
thread_id
.
hThrea
d
,
i_priority
)
)
{
msg_Warn
(
p_this
,
"couldn't set a faster priority"
);
return
1
;
...
...
@@ -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
)
{
vlc_object_internals_t
*
p_priv
=
p_this
->
p_internals
;
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( UNDER_CE ) || defined( WIN32 )
#if defined( UNDER_CE ) || defined( WIN32 )
HMODULE
hmodule
;
BOOL
(
WINAPI
*
OurGetThreadTimes
)(
HANDLE
,
FILETIME
*
,
FILETIME
*
,
FILETIME
*
,
FILETIME
*
);
...
...
@@ -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
;
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
(),
(
HANDLE
)
p_priv
->
thread_i
d
,
p_priv
->
thread_id
.
hThrea
d
,
GetCurrentProcess
(),
&
hThread
,
0
,
...
...
@@ -805,14 +788,17 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line
DUPLICATE_SAME_ACCESS
)
)
{
msg_Err
(
p_this
,
"thread_join(%u) failed at %s:%d (%s)"
,
(
unsigned
int
)
p_priv
->
thread_id
,
psz_file
,
i_line
,
GetLastError
()
);
(
unsigned
int
)
p_priv
->
thread_id
.
id
,
psz_file
,
i_line
,
GetLastError
()
);
p_priv
->
b_thread
=
VLC_FALSE
;
return
;
}
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 )
hmodule
=
GetModuleHandle
(
_T
(
"COREDLL"
)
);
#else
...
...
@@ -850,9 +836,19 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line
}
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 )
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 )
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
(
unsigned
int
)
p_priv
->
thread_id
,
psz_file
,
i_line
);
}
#endif
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 )
vlc_object_release
(
p_this
->
p_input
);
#ifdef WIN32
CloseHandle
(
p_this
->
p_internals
->
thread_id
);
#endif
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