[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [win-pv-devel] [PATCH 2/6] Add asynchronous device polling thread
> -----Original Message----- > From: win-pv-devel [mailto:win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx] On > Behalf Of owen.smith@xxxxxxxxxx > Sent: 24 July 2017 14:35 > To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx > Cc: Owen Smith <owen.smith@xxxxxxxxxx> > Subject: [win-pv-devel] [PATCH 2/6] Add asynchronous device polling thread > > From: Owen Smith <owen.smith@xxxxxxxxxx> > > Adds a thread that will asynchrously read the device handle. > This will be used to read console data from the device, for passing > to the named pipe. > > Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> Reviewed-by: Paul Durrant <paul.durrant@xxxxxxxxxx> > --- > src/monitor/monitor.c | 128 > ++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 128 insertions(+) > > diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c > index a2a3cc1..df94934 100644 > --- a/src/monitor/monitor.c > +++ b/src/monitor/monitor.c > @@ -65,6 +65,8 @@ typedef struct _MONITOR_CONTEXT { > HANDLE Device; > HANDLE MonitorEvent; > HANDLE MonitorThread; > + HANDLE DeviceEvent; > + HANDLE DeviceThread; > } MONITOR_CONTEXT, *PMONITOR_CONTEXT; > > MONITOR_CONTEXT MonitorContext; > @@ -456,6 +458,96 @@ fail1: > return 1; > } > > +DWORD WINAPI > +DeviceThread( > + IN LPVOID Argument > + ) > +{ > + PMONITOR_CONTEXT Context = &MonitorContext; > + OVERLAPPED Overlapped; > + HANDLE Device; > + UCHAR Buffer[MAXIMUM_BUFFER_SIZE]; > + DWORD Length; > + DWORD Wait; > + HANDLE Handles[2]; > + DWORD Error; > + > + UNREFERENCED_PARAMETER(Argument); > + > + Log("====>"); > + > + memset(&Overlapped, 0, sizeof(OVERLAPPED)); > + Overlapped.hEvent = CreateEvent(NULL, > + TRUE, > + FALSE, > + NULL); > + if (Overlapped.hEvent == NULL) > + goto fail1; > + > + Handles[0] = Context->DeviceEvent; > + Handles[1] = Overlapped.hEvent; > + > + Device = CreateFile(Context->DevicePath, > + GENERIC_READ, > + FILE_SHARE_READ | FILE_SHARE_WRITE, > + NULL, > + OPEN_EXISTING, > + FILE_FLAG_OVERLAPPED, > + NULL); > + if (Device == INVALID_HANDLE_VALUE) > + goto fail2; > + > + for (;;) { > + (VOID) ReadFile(Device, > + Buffer, > + sizeof(Buffer), > + NULL, > + &Overlapped); > + > + Wait = WaitForMultipleObjects(ARRAYSIZE(Handles), > + Handles, > + FALSE, > + INFINITE); > + if (Wait == WAIT_OBJECT_0) > + break; > + > + if (!GetOverlappedResult(Device, > + &Overlapped, > + &Length, > + FALSE)) > + break; > + > + ResetEvent(Overlapped.hEvent); > + > + // Length bytes of Buffer have been read > + } > + > + CloseHandle(Device); > + > + CloseHandle(Overlapped.hEvent); > + > + Log("<===="); > + > + return 0; > + > +fail2: > + Log("fail2\n"); > + > + CloseHandle(Overlapped.hEvent); > + > +fail1: > + Error = GetLastError(); > + > + { > + PTCHAR Message; > + Message = GetErrorMessage(Error); > + Log("fail1 (%s)", Message); > + LocalFree(Message); > + } > + > + return 1; > +} > + > static VOID > PutString( > IN HANDLE Handle, > @@ -551,10 +643,40 @@ MonitorAdd( > if (Context->MonitorThread == INVALID_HANDLE_VALUE) > goto fail5; > > + Context->DeviceEvent = CreateEvent(NULL, > + TRUE, > + FALSE, > + NULL); > + > + if (Context->DeviceEvent == NULL) > + goto fail6; > + > + Context->DeviceThread = CreateThread(NULL, > + 0, > + DeviceThread, > + NULL, > + 0, > + NULL); > + > + if (Context->DeviceThread == INVALID_HANDLE_VALUE) > + goto fail7; > + > Log("<===="); > > return; > > +fail7: > + Log("fail7\n"); > + > + CloseHandle(Context->DeviceEvent); > + Context->DeviceEvent = NULL; > + > +fail6: > + Log("fail6\n"); > + > + SetEvent(Context->MonitorThread); > + WaitForSingleObject(Context->MonitorThread, INFINITE); > + > fail5: > Log("fail5"); > > @@ -604,6 +726,12 @@ MonitorRemove( > > Log("====>"); > > + SetEvent(Context->DeviceEvent); > + WaitForSingleObject(Context->DeviceThread, INFINITE); > + > + CloseHandle(Context->DeviceEvent); > + Context->DeviceEvent = NULL; > + > SetEvent(Context->MonitorEvent); > WaitForSingleObject(Context->MonitorThread, INFINITE); > > -- > 2.8.3 > > > _______________________________________________ > win-pv-devel mailing list > win-pv-devel@xxxxxxxxxxxxxxxxxxxx > https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |