[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 09/20] Resolve lifecycle bugs
* make CDevice destructor virtual * call IDeviceCreator::OnDeviceRemoved when cleaning up device list on service stop * add logging to OutputDebugString Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/liteagent/DeviceList.cpp | 10 ++++++++-- src/liteagent/DeviceList.h | 2 +- src/liteagent/LiteAgent.cpp | 19 ++++++++++++++++--- src/liteagent/LiteAgent.h | 4 +++- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/liteagent/DeviceList.cpp b/src/liteagent/DeviceList.cpp index 3fc9a85..ce0ccd2 100644 --- a/src/liteagent/DeviceList.cpp +++ b/src/liteagent/DeviceList.cpp @@ -55,7 +55,7 @@ CDevice::CDevice(const wchar_t* path) : { } -CDevice::~CDevice() +/*virtual*/ CDevice::~CDevice() { Close(); } @@ -195,6 +195,8 @@ void CDeviceList::Stop() for (DeviceMap::iterator it = m_devs.begin(); it != m_devs.end(); ++it) { + if (m_impl) + m_impl->OnDeviceRemoved(it->second); delete it->second; } m_devs.clear(); @@ -277,6 +279,9 @@ void CDeviceList::OnDeviceQueryRemove(HANDLE handle) return; // spurious event? CDevice* dev = it->second; + if (dev == NULL) + return; // bad map entry + if (m_impl) m_impl->OnDeviceRemoved(dev); dev->Close(); @@ -289,6 +294,7 @@ void CDeviceList::OnDeviceRemoved(HANDLE handle) return; // spurious event? CDevice* dev = it->second; - delete dev; + if (dev) + delete dev; m_devs.erase(it); } diff --git a/src/liteagent/DeviceList.h b/src/liteagent/DeviceList.h index 6a1b0b4..6c8b6cb 100644 --- a/src/liteagent/DeviceList.h +++ b/src/liteagent/DeviceList.h @@ -41,7 +41,7 @@ class CDevice { public: CDevice(const wchar_t* path); - ~CDevice(); + virtual ~CDevice(); HANDLE Open(HANDLE svc); void Close(); diff --git a/src/liteagent/LiteAgent.cpp b/src/liteagent/LiteAgent.cpp index 908c0c9..ba48fc0 100644 --- a/src/liteagent/LiteAgent.cpp +++ b/src/liteagent/LiteAgent.cpp @@ -31,6 +31,7 @@ #define INITGUID #include <windows.h> +#include <stdio.h> #include "LiteAgent.h" #include "xeniface_ioctls.h" @@ -50,6 +51,14 @@ static CLiteAgent s_service; /*static*/ void CLiteAgent::Log(const char* fmt, ...) { + char message[256]; + va_list args; + + va_start(args, fmt); + vsnprintf_s(message, sizeof(message), sizeof(message)/sizeof(message[0]) - 1, fmt, args); + va_end(args); + + OutputDebugString(message); } /*static*/ int CLiteAgent::ServiceInstall() @@ -127,11 +136,15 @@ CLiteAgent::CLiteAgent() : m_handle(NULL), m_devs(GUID_INTERFACE_XENIFACE), m_de m_status.dwWaitHint = 0; m_svc_stop = CreateEvent(FALSE, NULL, NULL, FALSE); + m_shutdown = CreateEvent(FALSE, NULL, NULL, FALSE); + m_suspend = CreateEvent(FALSE, NULL, NULL, FALSE); } CLiteAgent::~CLiteAgent() { CloseHandle(m_svc_stop); + CloseHandle(m_shutdown); + CloseHandle(m_suspend); } /*virtual*/ CDevice* CLiteAgent::Create(const wchar_t* path) @@ -146,6 +159,7 @@ CLiteAgent::~CLiteAgent() if (m_dev == NULL) { m_dev = (CXenIfaceItf*)dev; // setting active device + CLiteAgent::Log("Starting Active Device\n"); } } @@ -154,7 +168,8 @@ CLiteAgent::~CLiteAgent() CLiteAgent::Log("OnDeviceRemoved(%ws)\n", dev->Path()); if ((CXenIfaceItf*)dev == m_dev) { m_dev = NULL; - // active device + // active device removed + CLiteAgent::Log("Active Device Removed\n"); } } @@ -172,7 +187,6 @@ void CLiteAgent::OnServiceStop() void CLiteAgent::OnDeviceEvent(DWORD evt, LPVOID data) { - CLiteAgent::Log("OnDeviceEvent()\n"); m_devs.OnDeviceEvent(evt, data); } @@ -220,7 +234,6 @@ DWORD WINAPI CLiteAgent::__ServiceControlHandlerEx(DWORD req, DWORD evt, LPVOID return NO_ERROR; case SERVICE_CONTROL_DEVICEEVENT: - CLiteAgent::Log("SERVICE_CONTROL_DEVICEEVENT\n"); SetServiceStatus(SERVICE_RUNNING); OnDeviceEvent(evt, data); return NO_ERROR; diff --git a/src/liteagent/LiteAgent.h b/src/liteagent/LiteAgent.h index 3680afd..2ec1f55 100644 --- a/src/liteagent/LiteAgent.h +++ b/src/liteagent/LiteAgent.h @@ -76,7 +76,9 @@ private: // service support SERVICE_STATUS m_status; SERVICE_STATUS_HANDLE m_handle; HANDLE m_svc_stop; - + HANDLE m_shutdown; + HANDLE m_suspend; + CDeviceList m_devs; CXenIfaceItf* m_dev; }; -- 1.9.4.msysgit.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |