[vlc-devel] commit: Win32: no need to put thread function into vlc_thread_t ( Rémi Denis-Courmont )
git version control
git at videolan.org
Sun Aug 2 08:53:51 CEST 2009
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Aug 1 23:44:36 2009 +0300| [15f16798332931f18604f1fb7166725030a3e1a3] | committer: Rémi Denis-Courmont
Win32: no need to put thread function into vlc_thread_t
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=15f16798332931f18604f1fb7166725030a3e1a3
---
include/vlc_threads.h | 3 +--
src/misc/w32thread.c | 39 ++++++++++++++++++++++++++++++---------
2 files changed, 31 insertions(+), 11 deletions(-)
diff --git a/include/vlc_threads.h b/include/vlc_threads.h
index 7b7a5b7..55fea78 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 b369733..e0e06a7 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
More information about the vlc-devel
mailing list