[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [win-pv-devel] [PATCH 4/6] Track active device in service class



> -----Original Message-----
> From: win-pv-devel [mailto:win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx] On
> Behalf Of Owen Smith
> Sent: 05 July 2016 11:38
> To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 4/6] Track active device in service class
> 
> Hold a CriticalSection protected local pointer to the XenIfaceDevice
> that is currently available. This will be used for all accesses to
> the interfaces provided.
> 
> Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>

Acked-by: Paul Durrant <paul.durrant@xxxxxxxxxx>

> ---
>  src/xenagent/service.cpp | 35 ++++++++++++++++++++++++++++++++++-
>  src/xenagent/service.h   |  2 ++
>  2 files changed, 36 insertions(+), 1 deletion(-)
> 
> diff --git a/src/xenagent/service.cpp b/src/xenagent/service.cpp
> index bd085f6..84b8814 100644
> --- a/src/xenagent/service.cpp
> +++ b/src/xenagent/service.cpp
> @@ -38,6 +38,24 @@
>  #include "service.h"
>  #include "messages.h"
> 
> +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) {
> @@ -151,7 +169,8 @@ static CXenAgent s_service;
>      return s_service.__ServiceControlHandlerEx(req, evt, data, ctxt);
>  }
> 
> -CXenAgent::CXenAgent() : m_handle(NULL), m_evtlog(NULL),
> m_devlist(GUID_INTERFACE_XENIFACE)
> +CXenAgent::CXenAgent() : m_handle(NULL), m_evtlog(NULL),
> +    m_devlist(GUID_INTERFACE_XENIFACE), m_device(NULL)
>  {
>      m_status.dwServiceType        = SERVICE_WIN32;
>      m_status.dwCurrentState       = SERVICE_START_PENDING;
> @@ -162,11 +181,15 @@ CXenAgent::CXenAgent() : m_handle(NULL),
> m_evtlog(NULL), m_devlist(GUID_INTERFAC
>      m_status.dwWaitHint           = 0;
> 
>      m_svc_stop = CreateEvent(FALSE, NULL, NULL, FALSE);
> +
> +    InitializeCriticalSection(&m_crit);
>  }
> 
>  CXenAgent::~CXenAgent()
>  {
>      CloseHandle(m_svc_stop);
> +
> +    DeleteCriticalSection(&m_crit);
>  }
> 
>  /*virtual*/ CDevice* CXenAgent::Create(const wchar_t* path)
> @@ -177,11 +200,21 @@ CXenAgent::~CXenAgent()
>  /*virtual*/ void CXenAgent::OnDeviceAdded(CDevice* dev)
>  {
>      CXenAgent::Log("OnDeviceAdded(%ws)\n", dev->Path());
> +
> +    CCritSec crit(&m_crit);
> +    if (m_device == NULL) {
> +        m_device = (CXenIfaceDevice*)dev;
> +    }
>  }
> 
>  /*virtual*/ void CXenAgent::OnDeviceRemoved(CDevice* dev)
>  {
>      CXenAgent::Log("OnDeviceRemoved(%ws)\n", dev->Path());
> +
> +    CCritSec crit(&m_crit);
> +    if (m_device == dev) {
> +        m_device = NULL;
> +    }
>  }
> 
>  void CXenAgent::OnServiceStart()
> diff --git a/src/xenagent/service.h b/src/xenagent/service.h
> index e31dcfd..acc4d52 100644
> --- a/src/xenagent/service.h
> +++ b/src/xenagent/service.h
> @@ -79,6 +79,8 @@ private: // service support
>      HANDLE                  m_svc_stop;
> 
>      CDeviceList             m_devlist;
> +    CXenIfaceDevice*        m_device;
> +    CRITICAL_SECTION        m_crit;
>  };
> 
>  #endif
> --
> 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
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.