[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XENBUS PATCH v3 3/5] Repeat TryAutoReboot() with timer
Add a timer that calls TryAutoReboot() every minute if reboot has been requested beforehand. Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx> Reviewed-by: Paul Durrant <paul@xxxxxxx> --- src/monitor/monitor.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c index 1bb4705..ccb2d8a 100644 --- a/src/monitor/monitor.c +++ b/src/monitor/monitor.c @@ -57,6 +57,7 @@ typedef struct _MONITOR_CONTEXT { HANDLE EventLog; HANDLE StopEvent; HANDLE RequestEvent; + HANDLE Timer; HKEY RequestKey; PTCHAR Title; PTCHAR Text; @@ -77,6 +78,7 @@ typedef struct _REBOOT_PROMPT { MONITOR_CONTEXT MonitorContext; #define MAXIMUM_BUFFER_SIZE 1024 +#define REBOOT_RETRY_DELAY 60000L // 1 minute #define SERVICES_KEY "SYSTEM\\CurrentControlSet\\Services" @@ -1347,6 +1349,7 @@ MonitorMain( PTCHAR RequestKeyName; BOOL Success; HRESULT Error; + LARGE_INTEGER DueTime; UNREFERENCED_PARAMETER(argc); UNREFERENCED_PARAMETER(argv); @@ -1426,17 +1429,33 @@ MonitorMain( if (!Success) goto fail10; + Context->Timer = CreateWaitableTimer(NULL, FALSE, NULL); + if (Context->Timer == NULL) + goto fail11; + + DueTime.QuadPart = -10000LL * REBOOT_RETRY_DELAY; + + Success = SetWaitableTimer(Context->Timer, + &DueTime, + REBOOT_RETRY_DELAY, + NULL, + NULL, + FALSE); + if (!Success) + goto fail12; + SetEvent(Context->RequestEvent); ReportStatus(SERVICE_RUNNING, NO_ERROR, 0); for (;;) { - HANDLE Events[3]; + HANDLE Events[4]; DWORD Object; Events[0] = Context->StopEvent; Events[1] = Context->RequestEvent; Events[2] = Context->ResponseEvent; + Events[3] = Context->Timer; Log("waiting (%u)...", ARRAYSIZE(Events)); Object = WaitForMultipleObjects(ARRAYSIZE(Events), @@ -1460,12 +1479,21 @@ MonitorMain( DoReboot(NULL, 0); break; + case WAIT_OBJECT_0 + 3: + if (Context->RebootRequestedBy) + TryAutoReboot(Context->RebootRequestedBy); + break; + default: break; } } done: + free(Context->RebootRequestedBy); + CancelWaitableTimer(Context->Timer); + CloseHandle(Context->Timer); + (VOID) RegDeleteTree(Context->RequestKey, NULL); free(Context->Question); @@ -1488,6 +1516,14 @@ done: return; +fail12: + Log("fail12"); + + CloseHandle(Context->Timer); + +fail11: + Log("fail11"); + fail10: Log("fail10"); -- 2.49.0.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 |