libwinpr-synch: proper handling fd event creation on Windows.
authorVic Lee <llyzs@163.com>
Fri, 21 Dec 2012 03:32:02 +0000 (11:32 +0800)
committerVic Lee <llyzs@163.com>
Fri, 21 Dec 2012 03:41:18 +0000 (11:41 +0800)
channels/audin/server/audin.c
channels/rdpsnd/server/rdpsnd.c
winpr/include/winpr/synch.h
winpr/libwinpr/synch/event.c

index 9e354cc..06d135b 100644 (file)
@@ -278,7 +278,7 @@ static void* audin_server_thread_func(void* arg)
                fd = *((void**) buffer);
                WTSFreeMemory(buffer);
 
-               thread->signals[thread->num_signals++] = CreateFileDescriptorEvent(NULL, TRUE, FALSE, ((int) (long) fd));
+               thread->signals[thread->num_signals++] = CreateWaitObjectEvent(NULL, TRUE, FALSE, fd);
        }
 
        /* Wait for the client to confirm that the Audio Input dynamic channel is ready */
index 8e868b6..0b499f9 100644 (file)
@@ -175,7 +175,7 @@ static void* rdpsnd_server_thread_func(void* arg)
                fd = *((void**) buffer);
                WTSFreeMemory(buffer);
 
-               thread->signals[thread->num_signals++] = CreateFileDescriptorEvent(NULL, TRUE, FALSE, ((int) (long) fd));
+               thread->signals[thread->num_signals++] = CreateWaitObjectEvent(NULL, TRUE, FALSE, fd);
        }
 
        s = stream_new(4096);
index 02ecb8e..9a764d9 100644 (file)
@@ -258,6 +258,8 @@ WINPR_API HANDLE CreateFileDescriptorEventW(LPSECURITY_ATTRIBUTES lpEventAttribu
                BOOL bManualReset, BOOL bInitialState, int FileDescriptor);
 WINPR_API HANDLE CreateFileDescriptorEventA(LPSECURITY_ATTRIBUTES lpEventAttributes,
                BOOL bManualReset, BOOL bInitialState, int FileDescriptor);
+WINPR_API HANDLE CreateWaitObjectEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,
+               BOOL bManualReset, BOOL bInitialState, void* pObject);
 
 #ifdef UNICODE
 #define CreateFileDescriptorEvent      CreateFileDescriptorEventW
index ac46083..c0ebca6 100644 (file)
@@ -201,6 +201,23 @@ HANDLE CreateFileDescriptorEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL
        return CreateFileDescriptorEventW(lpEventAttributes, bManualReset, bInitialState, FileDescriptor);
 }
 
+/**
+ * Returns an event based on the handle returned by GetEventWaitObject()
+ */
+HANDLE CreateWaitObjectEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,
+       BOOL bManualReset, BOOL bInitialState, void* pObject)
+{
+#ifndef _WIN32
+       return CreateFileDescriptorEventW(lpEventAttributes, bManualReset, bInitialState, (int) (ULONG_PTR) pObject);
+#else
+       HANDLE hEvent = NULL;
+
+       DuplicateHandle(GetCurrentProcess(), pObject, GetCurrentProcess(), &hEvent, 0, FALSE, DUPLICATE_SAME_ACCESS);
+
+       return hEvent;
+#endif
+}
+
 /*
  * Returns inner file descriptor for usage with select()
  * This file descriptor is not usable on Windows