diff --git a/winpr/libwinpr/handle/handle.c b/winpr/libwinpr/handle/handle.c index c4ea97206..4e0d9e840 100644 --- a/winpr/libwinpr/handle/handle.c +++ b/winpr/libwinpr/handle/handle.c @@ -39,7 +39,11 @@ BOOL CloseHandle(HANDLE hObject) if (!winpr_Handle_GetInfo(hObject, &Type, &Object)) return FALSE; - if (Type == HANDLE_TYPE_MUTEX) + if (Type == HANDLE_TYPE_THREAD) + { + return TRUE; + } + else if (Type == HANDLE_TYPE_MUTEX) { pthread_mutex_destroy((pthread_mutex_t*) Object); winpr_Handle_Remove(Object); @@ -69,6 +73,18 @@ BOOL CloseHandle(HANDLE hObject) return TRUE; } + else if (Type == HANDLE_TYPE_SEMAPHORE) + { +#if defined __APPLE__ + semaphore_destroy(mach_task_self(), *((winpr_sem_t*) Object)); +#else + sem_destroy((winpr_sem_t*) Object); +#endif + winpr_Handle_Remove(Object); + free(Object); + + return TRUE; + } return FALSE; } diff --git a/winpr/libwinpr/synch/event.c b/winpr/libwinpr/synch/event.c index de8678b23..d78fd1358 100644 --- a/winpr/libwinpr/synch/event.c +++ b/winpr/libwinpr/synch/event.c @@ -53,6 +53,11 @@ HANDLE CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, { event->bManualReset = bManualReset; + if (!event->bManualReset) + { + printf("CreateEventW: auto-reset events not yet implemented\n"); + } + event->pipe_fd[0] = -1; event->pipe_fd[1] = -1; diff --git a/winpr/libwinpr/synch/semaphore.c b/winpr/libwinpr/synch/semaphore.c index 1dffdd769..f7514f398 100644 --- a/winpr/libwinpr/synch/semaphore.c +++ b/winpr/libwinpr/synch/semaphore.c @@ -35,39 +35,30 @@ #ifndef _WIN32 -HANDLE CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCSTR lpName) -{ - winpr_sem_t* hSemaphore; - - hSemaphore = malloc(sizeof(winpr_sem_t)); - -#if defined __APPLE__ - semaphore_create(mach_task_self(), hSemaphore, SYNC_POLICY_FIFO, lMaximumCount); -#else - sem_init(hSemaphore, 0, lMaximumCount); -#endif - - return (HANDLE) hSemaphore; -} - HANDLE CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCWSTR lpName) { - winpr_sem_t* hSemaphore; + HANDLE handle; + winpr_sem_t* semaphore; - hSemaphore = malloc(sizeof(winpr_sem_t)); + semaphore = (winpr_sem_t*) malloc(sizeof(winpr_sem_t)); + if (semaphore) + { #if defined __APPLE__ - semaphore_create(mach_task_self(), hSemaphore, SYNC_POLICY_FIFO, lMaximumCount); + semaphore_create(mach_task_self(), semaphore, SYNC_POLICY_FIFO, lMaximumCount); #else - sem_init(hSemaphore, 0, lMaximumCount); + sem_init(semaphore, 0, lMaximumCount); #endif + } - return (HANDLE) hSemaphore; + handle = winpr_Handle_Insert(HANDLE_TYPE_SEMAPHORE, (PVOID) semaphore); + + return handle; } -HANDLE OpenSemaphoreA(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpName) +HANDLE CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCSTR lpName) { - return NULL; + return CreateSemaphoreW(lpSemaphoreAttributes, lInitialCount, lMaximumCount, NULL); } HANDLE OpenSemaphoreW(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpName) @@ -75,15 +66,30 @@ HANDLE OpenSemaphoreW(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpName return NULL; } +HANDLE OpenSemaphoreA(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpName) +{ + return NULL; +} + BOOL ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount, LPLONG lpPreviousCount) { -#if defined __APPLE__ - semaphore_signal(*((winpr_sem_t*) hSemaphore)); -#else - sem_post((winpr_sem_t*) hSemaphore); -#endif + ULONG Type; + PVOID Object; - return 1; + if (!winpr_Handle_GetInfo(hSemaphore, &Type, &Object)) + return FALSE; + + if (Type == HANDLE_TYPE_SEMAPHORE) + { +#if defined __APPLE__ + semaphore_signal(*((winpr_sem_t*) Object)); +#else + sem_post((winpr_sem_t*) Object); +#endif + return TRUE; + } + + return FALSE; } #endif diff --git a/winpr/libwinpr/synch/wait.c b/winpr/libwinpr/synch/wait.c index 1a98f2073..5a2707c8a 100644 --- a/winpr/libwinpr/synch/wait.c +++ b/winpr/libwinpr/synch/wait.c @@ -47,8 +47,18 @@ DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) if (!winpr_Handle_GetInfo(hHandle, &Type, &Object)) return WAIT_FAILED; + if (Type == HANDLE_TYPE_THREAD) + { + if (dwMilliseconds != INFINITE) + printf("WaitForSingleObject: timeout not implemented for thread wait\n"); + + pthread_join((pthread_t) Object, NULL); + } if (Type == HANDLE_TYPE_MUTEX) { + if (dwMilliseconds != INFINITE) + printf("WaitForSingleObject: timeout not implemented for mutex wait\n"); + pthread_mutex_lock((pthread_mutex_t*) Object); } else if (Type == HANDLE_TYPE_EVENT) @@ -78,6 +88,14 @@ DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) if (status != 1) return WAIT_TIMEOUT; } + else if (Type == HANDLE_TYPE_SEMAPHORE) + { +#if defined __APPLE__ + semaphore_wait(*((winpr_sem_t*) Object)); +#else + sem_wait((winpr_sem_t*) Object); +#endif + } return WAIT_OBJECT_0; } diff --git a/winpr/libwinpr/thread/thread.c b/winpr/libwinpr/thread/thread.c index d3b6ed912..9c06be93c 100644 --- a/winpr/libwinpr/thread/thread.c +++ b/winpr/libwinpr/thread/thread.c @@ -80,12 +80,15 @@ HANDLE CreateRemoteThread(HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttribu HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId) { + HANDLE handle; pthread_t thread; pthread_create(&thread, 0, (pthread_start_routine) lpStartAddress, lpParameter); pthread_detach(thread); - return winpr_Handle_Insert(HANDLE_TYPE_THREAD, (void*) thread); + handle = winpr_Handle_Insert(HANDLE_TYPE_THREAD, (void*) thread); + + return handle; } VOID ExitThread(DWORD dwExitCode)