[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 14/20] Protect active device with critical section
This should prevent race conditions due to device removal while currently attempting operations. Will ensure the m_dev pointer is not removed during a OnSuspend or OnShutdown operation Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/liteagent/LiteAgent.cpp | 32 +++++++++++++++++++++++++++++++- src/liteagent/LiteAgent.h | 1 + 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/liteagent/LiteAgent.cpp b/src/liteagent/LiteAgent.cpp index b61967f..db6c3b9 100644 --- a/src/liteagent/LiteAgent.cpp +++ b/src/liteagent/LiteAgent.cpp @@ -42,6 +42,24 @@ #define XENTOOLS_INSTALL_REG_KEY64 "SOFTWARE\\Wow6432Node\\Citrix\\XenTools" #endif +class CCritSec +{ +public: + CCritSec(LPCRITICAL_SECTION crit); + ~CCritSec(); +private: + LPCRITICAL_SECTION m_crit; +}; + +CCritSec::CCritSec(LPCRITICAL_SECTION crit) : m_crit(crit) +{ + EnterCriticalSection(m_crit); +} +CCritSec::~CCritSec() +{ + LeaveCriticalSection(m_crit); +} + int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE ignore, LPSTR lpCmdLine, int nCmdShow) { if (strlen(lpCmdLine) != 0) { @@ -169,7 +187,9 @@ CLiteAgent::CLiteAgent() : m_svc_stop = CreateEvent(FALSE, NULL, NULL, FALSE); m_shutdown = CreateEvent(FALSE, NULL, NULL, FALSE); - m_suspend = CreateEvent(FALSE, NULL, NULL, FALSE); + m_suspend = CreateEvent(FALSE, NULL, NULL, FALSE); + + InitializeCriticalSection(&m_crit); } CLiteAgent::~CLiteAgent() @@ -177,6 +197,8 @@ CLiteAgent::~CLiteAgent() CloseHandle(m_svc_stop); CloseHandle(m_shutdown); CloseHandle(m_suspend); + + DeleteCriticalSection(&m_crit); } /*virtual*/ CDevice* CLiteAgent::Create(const wchar_t* path) @@ -188,6 +210,8 @@ CLiteAgent::~CLiteAgent() /*virtual*/ void CLiteAgent::OnDeviceAdded(CDevice* dev) { CLiteAgent::Log("OnDeviceAdded(%ws)\n", dev->Path()); + + CCritSec crit(&m_crit); if (m_dev == NULL) { m_dev = (CXenIfaceItf*)dev; // setting active device @@ -210,6 +234,8 @@ CLiteAgent::~CLiteAgent() /*virtual*/ void CLiteAgent::OnDeviceRemoved(CDevice* dev) { CLiteAgent::Log("OnDeviceRemoved(%ws)\n", dev->Path()); + + CCritSec crit(&m_crit); if ((CXenIfaceItf*)dev == m_dev) { // active device removed CLiteAgent::Log("Active Device Removed\n"); @@ -273,6 +299,8 @@ bool CLiteAgent::ServiceMainLoop() void CLiteAgent::OnShutdown() { + CCritSec crit(&m_crit); + if (m_dev == NULL) return; CLiteAgent::Log("OnShutdown(%ws)\n", m_dev->Path()); @@ -286,6 +314,8 @@ void CLiteAgent::OnShutdown() void CLiteAgent::OnSuspend() { + CCritSec crit(&m_crit); + if (m_dev == NULL) return; CLiteAgent::Log("OnSuspend(%ws)\n", m_dev->Path()); diff --git a/src/liteagent/LiteAgent.h b/src/liteagent/LiteAgent.h index 97c6514..e3a2573 100644 --- a/src/liteagent/LiteAgent.h +++ b/src/liteagent/LiteAgent.h @@ -87,6 +87,7 @@ private: // service support HANDLE m_shutdown; HANDLE m_suspend; + CRITICAL_SECTION m_crit; CDeviceList m_devs; CXenIfaceItf* m_dev; void* m_ctxt_shutdown; -- 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 |