Commit 0965ae7d authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont
Browse files

vlc_join: check for deadlock

parent 1014a2aa
...@@ -179,7 +179,7 @@ VLC_EXPORT( void, __vlc_thread_join, ( vlc_object_t *, const char *, int ) ); ...@@ -179,7 +179,7 @@ VLC_EXPORT( void, __vlc_thread_join, ( vlc_object_t *, const char *, int ) );
VLC_EXPORT( int, vlc_clone, (vlc_thread_t *, void * (*) (void *), void *, int) ); VLC_EXPORT( int, vlc_clone, (vlc_thread_t *, void * (*) (void *), void *, int) );
VLC_EXPORT( void, vlc_cancel, (vlc_thread_t) ); VLC_EXPORT( void, vlc_cancel, (vlc_thread_t) );
VLC_EXPORT( int, vlc_join, (vlc_thread_t, void **) ); VLC_EXPORT( void, vlc_join, (vlc_thread_t, void **) );
VLC_EXPORT (void, vlc_control_cancel, (int cmd, ...)); VLC_EXPORT (void, vlc_control_cancel, (int cmd, ...));
#ifndef LIBVLC_USE_PTHREAD_CANCEL #ifndef LIBVLC_USE_PTHREAD_CANCEL
......
...@@ -621,10 +621,12 @@ void vlc_cancel (vlc_thread_t thread_id) ...@@ -621,10 +621,12 @@ void vlc_cancel (vlc_thread_t thread_id)
* @param p_result [OUT] pointer to write the thread return value or NULL * @param p_result [OUT] pointer to write the thread return value or NULL
* @return 0 on success, a standard error code otherwise. * @return 0 on success, a standard error code otherwise.
*/ */
int vlc_join (vlc_thread_t handle, void **result) void vlc_join (vlc_thread_t handle, void **result)
{ {
#if defined( LIBVLC_USE_PTHREAD ) #if defined( LIBVLC_USE_PTHREAD )
return pthread_join (handle, result); int val = pthread_join (handle, result);
if (val)
vlc_pthread_fatal ("joining thread", val, __FILE__, __LINE__);
#elif defined( UNDER_CE ) || defined( WIN32 ) #elif defined( UNDER_CE ) || defined( WIN32 )
do do
...@@ -636,15 +638,13 @@ int vlc_join (vlc_thread_t handle, void **result) ...@@ -636,15 +638,13 @@ int vlc_join (vlc_thread_t handle, void **result)
if (result) if (result)
*result = handle->data; *result = handle->data;
free (handle); free (handle);
return 0;
#elif defined( HAVE_KERNEL_SCHEDULER_H ) #elif defined( HAVE_KERNEL_SCHEDULER_H )
int32_t exit_value; int32_t exit_value;
ret = (B_OK == wait_for_thread( p_priv->thread_id, &exit_value )); int val = (B_OK == wait_for_thread( p_priv->thread_id, &exit_value ));
if( !ret && result ) if( !val && result )
*result = (void *)exit_value; *result = (void *)exit_value;
return ret;
#endif #endif
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment