From: RĂ©mi Denis-Courmont Date: Sat, 1 Aug 2009 20:44:36 +0000 (+0300) Subject: Win32: no need to put thread function into vlc_thread_t X-Git-Tag: 1.1.0-ff~4629 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=15f16798332931f18604f1fb7166725030a3e1a3;p=vlc Win32: no need to put thread function into vlc_thread_t --- diff --git a/include/vlc_threads.h b/include/vlc_threads.h index 7b7a5b7f74..55fea78859 100644 --- a/include/vlc_threads.h +++ b/include/vlc_threads.h @@ -129,8 +129,7 @@ struct vlc_timer_t typedef struct { HANDLE handle; - void *(*entry) (void *); - void *data; + void *result; #if defined( UNDER_CE ) HANDLE cancel_event; #endif diff --git a/src/misc/w32thread.c b/src/misc/w32thread.c index b3697334a3..e0e06a717e 100644 --- a/src/misc/w32thread.c +++ b/src/misc/w32thread.c @@ -407,16 +407,27 @@ void vlc_threads_setup (libvlc_int_t *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_thread_t self = data; + struct vlc_entry_data data; + + memcpy (&data, p, sizeof (data)); + free (p); + #ifdef UNDER_CE - cancel_data.cancel_event = self->cancel_event; + cancel_data.cancel_event = data.handle->cancel_event; #endif vlc_threadvar_set (cancel_key, &cancel_data); - self->data = self->entry (self->data); + data.handle->result = data.func (data.data); return 0; } @@ -433,19 +444,28 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data, if (th == NULL) return ENOMEM; - th->data = data; - th->entry = entry; + struct vlc_entry_data *entry_data = malloc (sizeof (*entry_data)); + if (entry_data == NULL) + { + free (th); + return ENOMEM; + } + entry_data->handle = th; + entry_data->func = entry; + entry_data->data = data; + #if defined( UNDER_CE ) th->cancel_event = CreateEvent (NULL, FALSE, FALSE, NULL); if (th->cancel_event == NULL) { free(th); + free (entry_data); 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 hThread = (HANDLE)(uintptr_t) - _beginthreadex (NULL, 0, vlc_entry, th, CREATE_SUSPENDED, NULL); + _beginthreadex (NULL, 0, vlc_entry, entry_data, CREATE_SUSPENDED, NULL); #endif if (hThread) @@ -459,6 +479,7 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data, { CloseHandle (hThread); free (th); + free (entry_data); return ENOMEM; } #else @@ -485,7 +506,7 @@ void vlc_join (vlc_thread_t handle, void **result) CloseHandle (handle->handle); if (result) - *result = handle->data; + *result = handle->result; #ifdef UNDER_CE CloseHandle (handle->cancel_event); #endif