[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XENIFACE PATCH v2] xenagent: Add TimeSyncMode option
xenagent's time sync mechanism interferes with w32time's own time sync, especially in a domain environment where domain members are expected to follow the PDCe. Add a REG_DWORD value TimeSyncMode in xenagent. Setting this value to 0 will disable the XenTime sync. Note that this setting is not honored during time sync attempts after resume. Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx> --- src/xenagent/service.cpp | 4 ++-- src/xenagent/xenifacedevice.cpp | 31 +++++++++++++++++++++++++++---- src/xenagent/xenifacedevice.h | 4 ++-- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/xenagent/service.cpp b/src/xenagent/service.cpp index 535d761..6ef7b1a 100644 --- a/src/xenagent/service.cpp +++ b/src/xenagent/service.cpp @@ -216,7 +216,7 @@ bool CXenAgent::ServiceMainLoop() case WAIT_OBJECT_0+2: ResetEvent(m_xeniface.m_evt_suspend); - m_xeniface.CheckXenTime(); + m_xeniface.CheckXenTime(true); m_xeniface.CheckSuspend(); return true; // continue loop @@ -230,7 +230,7 @@ bool CXenAgent::ServiceMainLoop() return true; // continue loop } case WAIT_TIMEOUT: - m_xeniface.CheckXenTime(); + m_xeniface.CheckXenTime(false); __fallthrough; case WAIT_IO_COMPLETION: m_xeniface.CheckSuspend(); diff --git a/src/xenagent/xenifacedevice.cpp b/src/xenagent/xenifacedevice.cpp index 69a584b..7b45c8c 100644 --- a/src/xenagent/xenifacedevice.cpp +++ b/src/xenagent/xenifacedevice.cpp @@ -40,6 +40,13 @@ #include "xeniface_ioctls.h" #include "messages.h" +#define SERVICES_KEY "SYSTEM\\CurrentControlSet\\Services" + +#define SERVICE_KEY(_Service) \ + SERVICES_KEY ## "\\" ## _Service + +#define TIME_SYNC_MODE_DISABLED 0 + CXenIfaceDevice::CXenIfaceDevice(const wchar_t* path) : CDevice(path) {} @@ -213,7 +220,7 @@ CXenIfaceDeviceList::CXenIfaceDeviceList(CXenAgent* agent) : CDeviceList(GUID_IN if (m_agent->ConvDevicePresent()) StartSlateModeWatch(device); - SetXenTime(device); + SetXenTime(device, false); } /*virtual*/ void CXenIfaceDeviceList::OnDeviceRemoved(CDevice* dev) @@ -339,7 +346,7 @@ bool CXenIfaceDeviceList::CheckShutdown() return false; } -void CXenIfaceDeviceList::CheckXenTime() +void CXenIfaceDeviceList::CheckXenTime(bool forced) { CCritSec crit(&m_crit); CXenIfaceDevice* device = (CXenIfaceDevice*)GetFirstDevice(); @@ -347,7 +354,7 @@ void CXenIfaceDeviceList::CheckXenTime() if (device == NULL) return; - SetXenTime(device); + SetXenTime(device, forced); } void CXenIfaceDeviceList::CheckSuspend() @@ -485,10 +492,26 @@ void CXenIfaceDeviceList::AcquireShutdownPrivilege() CloseHandle(token); } -void CXenIfaceDeviceList::SetXenTime(CXenIfaceDevice* device) +void CXenIfaceDeviceList::SetXenTime(CXenIfaceDevice* device, bool forced) { bool local; + if (!forced) { + DWORD mode = 0; + DWORD size = sizeof(mode); + LSTATUS lstatus; + + lstatus = RegGetValue(HKEY_LOCAL_MACHINE, + TEXT(SERVICE_KEY(__MODULE__)), + TEXT("TimeSyncMode"), + RRF_RT_DWORD, + NULL, + &mode, + &size); + if (lstatus == ERROR_SUCCESS && mode == TIME_SYNC_MODE_DISABLED) + return; + } + FILETIME now = { 0 }; if (!device->SharedInfoGetTime(&now, &local)) return; diff --git a/src/xenagent/xenifacedevice.h b/src/xenagent/xenifacedevice.h index d85e469..8a89036 100644 --- a/src/xenagent/xenifacedevice.h +++ b/src/xenagent/xenifacedevice.h @@ -84,7 +84,7 @@ public: void Log(const char* message); bool CheckShutdown(); - void CheckXenTime(); + void CheckXenTime(bool forced); void CheckSuspend(); bool CheckSlateMode(std::string& mode); void LogIfRebootPending(); @@ -95,7 +95,7 @@ private: void StartSlateModeWatch(CXenIfaceDevice* device); void StopSlateModeWatch(CXenIfaceDevice* device); void AcquireShutdownPrivilege(); - void SetXenTime(CXenIfaceDevice* device); + void SetXenTime(CXenIfaceDevice* device, bool forced); private: CXenAgent* m_agent; -- 2.50.1.windows.1 Ngoc Tu Dinh | Vates XCP-ng Developer XCP-ng & Xen Orchestra - Vates solutions web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |