Commit 15f16798 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Win32: no need to put thread function into vlc_thread_t

parent 28150f2c
...@@ -129,8 +129,7 @@ struct vlc_timer_t ...@@ -129,8 +129,7 @@ struct vlc_timer_t
typedef struct typedef struct
{ {
HANDLE handle; HANDLE handle;
void *(*entry) (void *); void *result;
void *data;
#if defined( UNDER_CE ) #if defined( UNDER_CE )
HANDLE cancel_event; HANDLE cancel_event;
#endif #endif
......
...@@ -407,16 +407,27 @@ void vlc_threads_setup (libvlc_int_t *p_libvlc) ...@@ -407,16 +407,27 @@ void vlc_threads_setup (libvlc_int_t *p_libvlc)
(void) p_libvlc; (void) p_libvlc;
} }
static unsigned __stdcall vlc_entry (void *data) struct vlc_entry_data
{
vlc_thread_t handle;
void * (*func) (void *);
void * data;
};
static unsigned __stdcall vlc_entry (void *p)
{ {
vlc_cancel_t cancel_data = VLC_CANCEL_INIT; vlc_cancel_t cancel_data = VLC_CANCEL_INIT;
vlc_thread_t self = data; struct vlc_entry_data data;
memcpy (&data, p, sizeof (data));
free (p);
#ifdef UNDER_CE #ifdef UNDER_CE
cancel_data.cancel_event = self->cancel_event; cancel_data.cancel_event = data.handle->cancel_event;
#endif #endif
vlc_threadvar_set (cancel_key, &cancel_data); vlc_threadvar_set (cancel_key, &cancel_data);
self->data = self->entry (self->data); data.handle->result = data.func (data.data);
return 0; return 0;
} }
...@@ -433,19 +444,28 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data, ...@@ -433,19 +444,28 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data,
if (th == NULL) if (th == NULL)
return ENOMEM; return ENOMEM;
th->data = data; struct vlc_entry_data *entry_data = malloc (sizeof (*entry_data));
th->entry = entry; if (entry_data == NULL)
{
free (th);
return ENOMEM;
}
entry_data->handle = th;
entry_data->func = entry;
entry_data->data = data;
#if defined( UNDER_CE ) #if defined( UNDER_CE )
th->cancel_event = CreateEvent (NULL, FALSE, FALSE, NULL); th->cancel_event = CreateEvent (NULL, FALSE, FALSE, NULL);
if (th->cancel_event == NULL) if (th->cancel_event == NULL)
{ {
free(th); free(th);
free (entry_data);
return errno; return errno;
} }
hThread = CreateThread (NULL, 128*1024, vlc_entry, th, CREATE_SUSPENDED, NULL); hThread = CreateThread (NULL, 128*1024, vlc_entry, entry_data, CREATE_SUSPENDED, NULL);
#else #else
hThread = (HANDLE)(uintptr_t) hThread = (HANDLE)(uintptr_t)
_beginthreadex (NULL, 0, vlc_entry, th, CREATE_SUSPENDED, NULL); _beginthreadex (NULL, 0, vlc_entry, entry_data, CREATE_SUSPENDED, NULL);
#endif #endif
if (hThread) if (hThread)
...@@ -459,6 +479,7 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data, ...@@ -459,6 +479,7 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data,
{ {
CloseHandle (hThread); CloseHandle (hThread);
free (th); free (th);
free (entry_data);
return ENOMEM; return ENOMEM;
} }
#else #else
...@@ -485,7 +506,7 @@ void vlc_join (vlc_thread_t handle, void **result) ...@@ -485,7 +506,7 @@ void vlc_join (vlc_thread_t handle, void **result)
CloseHandle (handle->handle); CloseHandle (handle->handle);
if (result) if (result)
*result = handle->data; *result = handle->result;
#ifdef UNDER_CE #ifdef UNDER_CE
CloseHandle (handle->cancel_event); CloseHandle (handle->cancel_event);
#endif #endif
......
Markdown is supported
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