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

Win32: make vlc_thread_t a plain HANDLE (no heap alloc)

parent 84a6069c
...@@ -126,13 +126,7 @@ struct vlc_timer_t ...@@ -126,13 +126,7 @@ struct vlc_timer_t
}; };
#elif defined( WIN32 ) #elif defined( WIN32 )
typedef struct typedef HANDLE vlc_thread_t;
{
HANDLE handle;
#if defined( UNDER_CE )
HANDLE cancel_event;
#endif
} *vlc_thread_t;
typedef struct typedef struct
{ {
......
...@@ -409,7 +409,6 @@ void vlc_threads_setup (libvlc_int_t *p_libvlc) ...@@ -409,7 +409,6 @@ void vlc_threads_setup (libvlc_int_t *p_libvlc)
struct vlc_entry_data struct vlc_entry_data
{ {
vlc_thread_t handle;
void * (*func) (void *); void * (*func) (void *);
void * data; void * data;
}; };
...@@ -439,18 +438,10 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data, ...@@ -439,18 +438,10 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data,
* memory leaks and the signal functions not working (see Microsoft * memory leaks and the signal functions not working (see Microsoft
* Knowledge Base, article 104641) */ * Knowledge Base, article 104641) */
HANDLE hThread; HANDLE hThread;
vlc_thread_t th = malloc (sizeof (*th));
if (th == NULL)
return ENOMEM;
struct vlc_entry_data *entry_data = malloc (sizeof (*entry_data)); struct vlc_entry_data *entry_data = malloc (sizeof (*entry_data));
if (entry_data == NULL) if (entry_data == NULL)
{
free (th);
return ENOMEM; return ENOMEM;
}
entry_data->handle = th;
entry_data->func = entry; entry_data->func = entry;
entry_data->data = data; entry_data->data = data;
...@@ -458,7 +449,6 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data, ...@@ -458,7 +449,6 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data,
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 (entry_data); free (entry_data);
return errno; return errno;
} }
...@@ -474,11 +464,10 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data, ...@@ -474,11 +464,10 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data,
/* Thread closes the handle when exiting, duplicate it here /* Thread closes the handle when exiting, duplicate it here
* to be on the safe side when joining. */ * to be on the safe side when joining. */
if (!DuplicateHandle (GetCurrentProcess (), hThread, if (!DuplicateHandle (GetCurrentProcess (), hThread,
GetCurrentProcess (), &th->handle, 0, FALSE, GetCurrentProcess (), p_handle, 0, FALSE,
DUPLICATE_SAME_ACCESS)) DUPLICATE_SAME_ACCESS))
{ {
CloseHandle (hThread); CloseHandle (hThread);
free (th);
free (entry_data); free (entry_data);
return ENOMEM; return ENOMEM;
} }
...@@ -489,11 +478,8 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data, ...@@ -489,11 +478,8 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data,
ResumeThread (hThread); ResumeThread (hThread);
if (priority) if (priority)
SetThreadPriority (hThread, priority); SetThreadPriority (hThread, priority);
*p_handle = th;
return 0; return 0;
} }
free (th);
return errno; return errno;
} }
...@@ -501,15 +487,14 @@ void vlc_join (vlc_thread_t handle, void **result) ...@@ -501,15 +487,14 @@ void vlc_join (vlc_thread_t handle, void **result)
{ {
do do
vlc_testcancel (); vlc_testcancel ();
while (WaitForSingleObjectEx (handle->handle, INFINITE, TRUE) while (WaitForSingleObjectEx (handle, INFINITE, TRUE)
== WAIT_IO_COMPLETION); == WAIT_IO_COMPLETION);
CloseHandle (handle->handle); CloseHandle (handle);
assert (result == NULL); /* <- FIXME if ever needed */ assert (result == NULL); /* <- FIXME if ever needed */
#ifdef UNDER_CE #ifdef UNDER_CE
CloseHandle (handle->cancel_event); CloseHandle (handle->cancel_event);
#endif #endif
free (handle);
} }
...@@ -525,7 +510,7 @@ static void CALLBACK vlc_cancel_self (ULONG_PTR dummy) ...@@ -525,7 +510,7 @@ static void CALLBACK vlc_cancel_self (ULONG_PTR dummy)
void vlc_cancel (vlc_thread_t thread_id) void vlc_cancel (vlc_thread_t thread_id)
{ {
#ifndef UNDER_CE #ifndef UNDER_CE
QueueUserAPC (vlc_cancel_self, thread_id->handle, 0); QueueUserAPC (vlc_cancel_self, thread_id, 0);
#else #else
SetEvent (thread_id->cancel_event); SetEvent (thread_id->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