Merge pull request #868 from llyzs/windows

Fix event handles on Windows
This commit is contained in:
Marc-André Moreau 2012-12-20 19:47:36 -08:00
commit 0e334c2131
7 changed files with 71 additions and 23 deletions

View File

@ -278,7 +278,7 @@ static void* audin_server_thread_func(void* arg)
fd = *((void**) buffer); fd = *((void**) buffer);
WTSFreeMemory(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 */ /* Wait for the client to confirm that the Audio Input dynamic channel is ready */

View File

@ -1262,13 +1262,13 @@ static void freerdp_channels_process_sync(rdpChannels* channels, freerdp* instan
BOOL freerdp_channels_get_fds(rdpChannels* channels, freerdp* instance, void** read_fds, BOOL freerdp_channels_get_fds(rdpChannels* channels, freerdp* instance, void** read_fds,
int* read_count, void** write_fds, int* write_count) int* read_count, void** write_fds, int* write_count)
{ {
int fd; void* pfd;
fd = GetEventFileDescriptor(channels->signal); pfd = GetEventWaitObject(channels->signal);
if (fd != -1) if (pfd)
{ {
read_fds[*read_count] = ((void*) (long) fd); read_fds[*read_count] = pfd;
(*read_count)++; (*read_count)++;
} }

View File

@ -175,7 +175,7 @@ static void* rdpsnd_server_thread_func(void* arg)
fd = *((void**) buffer); fd = *((void**) buffer);
WTSFreeMemory(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); s = stream_new(4096);

View File

@ -469,23 +469,23 @@ void WTSDestroyVirtualChannelManager(WTSVirtualChannelManager* vcm)
void WTSVirtualChannelManagerGetFileDescriptor(WTSVirtualChannelManager* vcm, void WTSVirtualChannelManagerGetFileDescriptor(WTSVirtualChannelManager* vcm,
void** fds, int* fds_count) void** fds, int* fds_count)
{ {
int fd; void* fd;
fd = GetEventFileDescriptor(vcm->send_event); fd = GetEventWaitObject(vcm->send_event);
if (fd != -1) if (fd)
{ {
fds[*fds_count] = ((void*) (long) fd); fds[*fds_count] = fd;
(*fds_count)++; (*fds_count)++;
} }
if (vcm->drdynvc_channel) if (vcm->drdynvc_channel)
{ {
fd = GetEventFileDescriptor(vcm->drdynvc_channel->receive_event); fd = GetEventWaitObject(vcm->drdynvc_channel->receive_event);
if (fd != -1) if (fd)
{ {
fds[*fds_count] = ((void*) (long) fd); fds[*fds_count] = fd;
(*fds_count)++; (*fds_count)++;
} }
} }
@ -626,7 +626,7 @@ BOOL WTSVirtualChannelQuery(
/* __out */ void** ppBuffer, /* __out */ void** ppBuffer,
/* __out */ UINT32* pBytesReturned) /* __out */ UINT32* pBytesReturned)
{ {
int fd; void* pfd;
BOOL bval; BOOL bval;
void* fds[10]; void* fds[10];
int fds_count = 0; int fds_count = 0;
@ -637,11 +637,11 @@ BOOL WTSVirtualChannelQuery(
{ {
case WTSVirtualFileHandle: case WTSVirtualFileHandle:
fd = GetEventFileDescriptor(channel->receive_event); pfd = GetEventWaitObject(channel->receive_event);
if (fd != -1) if (pfd)
{ {
fds[fds_count] = ((void*) (long) fd); fds[fds_count] = pfd;
(fds_count)++; (fds_count)++;
} }

View File

@ -515,7 +515,7 @@ int transport_write(rdpTransport* transport, STREAM* s)
void transport_get_fds(rdpTransport* transport, void** rfds, int* rcount) void transport_get_fds(rdpTransport* transport, void** rfds, int* rcount)
{ {
int fd; void* pfd;
#ifdef _WIN32 #ifdef _WIN32
rfds[*rcount] = transport->TcpIn->wsa_event; rfds[*rcount] = transport->TcpIn->wsa_event;
@ -537,11 +537,11 @@ void transport_get_fds(rdpTransport* transport, void** rfds, int* rcount)
} }
#endif #endif
fd = GetEventFileDescriptor(transport->recv_event); pfd = GetEventWaitObject(transport->recv_event);
if (fd != -1) if (pfd)
{ {
rfds[*rcount] = ((void*) (long) fd); rfds[*rcount] = pfd;
(*rcount)++; (*rcount)++;
} }
} }

View File

@ -258,8 +258,8 @@ WINPR_API HANDLE CreateFileDescriptorEventW(LPSECURITY_ATTRIBUTES lpEventAttribu
BOOL bManualReset, BOOL bInitialState, int FileDescriptor); BOOL bManualReset, BOOL bInitialState, int FileDescriptor);
WINPR_API HANDLE CreateFileDescriptorEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, WINPR_API HANDLE CreateFileDescriptorEventA(LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset, BOOL bInitialState, int FileDescriptor); BOOL bManualReset, BOOL bInitialState, int FileDescriptor);
WINPR_API HANDLE CreateWaitObjectEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,
WINPR_API int GetEventFileDescriptor(HANDLE hEvent); BOOL bManualReset, BOOL bInitialState, void* pObject);
#ifdef UNICODE #ifdef UNICODE
#define CreateFileDescriptorEvent CreateFileDescriptorEventW #define CreateFileDescriptorEvent CreateFileDescriptorEventW
@ -267,5 +267,8 @@ WINPR_API int GetEventFileDescriptor(HANDLE hEvent);
#define CreateFileDescriptorEvent CreateFileDescriptorEventA #define CreateFileDescriptorEvent CreateFileDescriptorEventA
#endif #endif
WINPR_API int GetEventFileDescriptor(HANDLE hEvent);
WINPR_API void* GetEventWaitObject(HANDLE hEvent);
#endif /* WINPR_SYNCH_H */ #endif /* WINPR_SYNCH_H */

View File

@ -201,6 +201,28 @@ HANDLE CreateFileDescriptorEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL
return CreateFileDescriptorEventW(lpEventAttributes, bManualReset, bInitialState, FileDescriptor); 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
*/
int GetEventFileDescriptor(HANDLE hEvent) int GetEventFileDescriptor(HANDLE hEvent)
{ {
#ifndef _WIN32 #ifndef _WIN32
@ -218,3 +240,26 @@ int GetEventFileDescriptor(HANDLE hEvent)
return -1; return -1;
#endif #endif
} }
/**
* Returns platform-specific wait object as a void pointer
*
* On Windows, the returned object is the same as the hEvent
* argument and is an event HANDLE usable in WaitForMultipleObjects
*
* On other platforms, the returned object can be cast to an int
* to obtain a file descriptor usable in select()
*/
void* GetEventWaitObject(HANDLE hEvent)
{
#ifndef _WIN32
int fd;
fd = GetEventFileDescriptor(hEvent);
return ((void*) (long) fd);
#else
return hEvent;
#endif
}