[DCOMLAUNCH][WMISVC] Stop busy waiting shutdown
authorPierre Schweitzer <pierre@reactos.org>
Sun, 3 Mar 2019 22:14:07 +0000 (23:14 +0100)
committerPierre Schweitzer <pierre@reactos.org>
Sun, 3 Mar 2019 22:14:37 +0000 (23:14 +0100)
base/services/dcomlaunch/dcomlaunch.c
base/services/wmisvc/wmisvc.c

index 280dbff..49c8541 100644 (file)
@@ -25,6 +25,7 @@ static WCHAR ServiceName[] = L"dcomlaunch";
 
 static SERVICE_STATUS_HANDLE ServiceStatusHandle;
 static SERVICE_STATUS ServiceStatus;
+static HANDLE ShutdownEvent;
 
 /* FUNCTIONS *****************************************************************/
 
@@ -62,7 +63,8 @@ ServiceControlHandler(DWORD dwControl,
     {
         case SERVICE_CONTROL_STOP:
             DPRINT1("  SERVICE_CONTROL_STOP received\n");
-            UpdateServiceStatus(SERVICE_STOPPED);
+            SetEvent(ShutdownEvent);
+            UpdateServiceStatus(SERVICE_STOP_PENDING);
             return ERROR_SUCCESS;
 
         case SERVICE_CONTROL_PAUSE:
@@ -83,7 +85,8 @@ ServiceControlHandler(DWORD dwControl,
 
         case SERVICE_CONTROL_SHUTDOWN:
             DPRINT1("  SERVICE_CONTROL_SHUTDOWN received\n");
-            UpdateServiceStatus(SERVICE_STOPPED);
+            SetEvent(ShutdownEvent);
+            UpdateServiceStatus(SERVICE_STOP_PENDING);
             return ERROR_SUCCESS;
 
         default :
@@ -111,14 +114,14 @@ ServiceMain(DWORD argc, LPTSTR *argv)
         return;
     }
 
+    ShutdownEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
+
     DealWithDeviceEvent();
 
     UpdateServiceStatus(SERVICE_RUNNING);
 
-    do
-    {
-        Sleep(1);
-    } while (1);
+    WaitForSingleObject(ShutdownEvent, INFINITE);
+    CloseHandle(ShutdownEvent);
 
     UpdateServiceStatus(SERVICE_STOPPED);
 }
index 8ac9d9b..042ff84 100644 (file)
@@ -44,6 +44,7 @@ static WCHAR ServiceName[] = L"winmgmt";
 
 static SERVICE_STATUS_HANDLE ServiceStatusHandle;
 static SERVICE_STATUS ServiceStatus;
+static HANDLE ShutdownEvent;
 
 /* FUNCTIONS *****************************************************************/
 
@@ -81,7 +82,8 @@ ServiceControlHandler(DWORD dwControl,
     {
         case SERVICE_CONTROL_STOP:
             DPRINT1("  SERVICE_CONTROL_STOP received\n");
-            UpdateServiceStatus(SERVICE_STOPPED);
+            SetEvent(ShutdownEvent);
+            UpdateServiceStatus(SERVICE_STOP_PENDING);
             return ERROR_SUCCESS;
 
         case SERVICE_CONTROL_PAUSE:
@@ -102,7 +104,8 @@ ServiceControlHandler(DWORD dwControl,
 
         case SERVICE_CONTROL_SHUTDOWN:
             DPRINT1("  SERVICE_CONTROL_SHUTDOWN received\n");
-            UpdateServiceStatus(SERVICE_STOPPED);
+            SetEvent(ShutdownEvent);
+            UpdateServiceStatus(SERVICE_STOP_PENDING);
             return ERROR_SUCCESS;
 
         default :
@@ -128,12 +131,12 @@ ServiceMain(DWORD argc, LPTSTR *argv)
         return;
     }
 
+    ShutdownEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
+
     UpdateServiceStatus(SERVICE_RUNNING);
 
-    do
-    {
-        Sleep(1);
-    } while (1);
+    WaitForSingleObject(ShutdownEvent, INFINITE);
+    CloseHandle(ShutdownEvent);
 
     UpdateServiceStatus(SERVICE_STOPPED);
 }