[SERVICES]
[reactos.git] / reactos / base / system / services / database.c
index 7a9819e..9a332a0 100644 (file)
@@ -30,6 +30,8 @@ LIST_ENTRY ServiceListHead;
 static RTL_RESOURCE DatabaseLock;
 static DWORD dwResumeCount = 1;
 
+static CRITICAL_SECTION NamedPipeCriticalSection;
+static CRITICAL_SECTION StartServiceCriticalSection;
 
 /* FUNCTIONS *****************************************************************/
 
@@ -704,6 +706,8 @@ ScmControlService(PSERVICE Service,
     ControlPacket->hServiceStatus = (SERVICE_STATUS_HANDLE)Service;
     wcscpy(&ControlPacket->szArguments[0], Service->lpServiceName);
 
+    EnterCriticalSection(&NamedPipeCriticalSection);
+
     /* Send the control packet */
     WriteFile(Service->ControlPipeHandle,
               ControlPacket,
@@ -718,6 +722,8 @@ ScmControlService(PSERVICE Service,
              &dwReadCount,
              NULL);
 
+    LeaveCriticalSection(&NamedPipeCriticalSection);
+
     /* Release the contol packet */
     HeapFree(GetProcessHeap(),
              0,
@@ -795,6 +801,8 @@ ScmSendStartCommand(PSERVICE Service,
     /* Terminate the argument list */
     *Ptr = 0;
 
+    EnterCriticalSection(&NamedPipeCriticalSection);
+
     /* Send the start command */
     WriteFile(Service->ControlPipeHandle,
               ControlPacket,
@@ -809,6 +817,8 @@ ScmSendStartCommand(PSERVICE Service,
              &dwReadCount,
              NULL);
 
+    LeaveCriticalSection(&NamedPipeCriticalSection);
+
     /* Release the contol packet */
     HeapFree(GetProcessHeap(),
              0,
@@ -1026,6 +1036,8 @@ ScmStartService(PSERVICE Service, DWORD argc, LPWSTR *argv)
     PSERVICE_GROUP Group = Service->lpGroup;
     DWORD dwError = ERROR_SUCCESS;
 
+    EnterCriticalSection(&StartServiceCriticalSection);
+
     DPRINT("ScmStartService() called\n");
 
     Service->ControlPipeHandle = INVALID_HANDLE_VALUE;
@@ -1056,6 +1068,7 @@ ScmStartService(PSERVICE Service, DWORD argc, LPWSTR *argv)
     }
 
     DPRINT("ScmStartService() done (Error %lu)\n", dwError);
+    LeaveCriticalSection(&StartServiceCriticalSection);
 
     if (dwError == ERROR_SUCCESS)
     {
@@ -1257,4 +1270,20 @@ ScmUnlockDatabase(VOID)
     RtlReleaseResource(&DatabaseLock);
 }
 
+
+VOID
+ScmInitNamedPipeCriticalSection(VOID)
+{
+    InitializeCriticalSection(&NamedPipeCriticalSection);
+    InitializeCriticalSection(&StartServiceCriticalSection);
+}
+
+
+VOID
+ScmDeleteNamedPipeCriticalSection(VOID)
+{
+    DeleteCriticalSection(&StartServiceCriticalSection);
+    DeleteCriticalSection(&NamedPipeCriticalSection);
+}
+
 /* EOF */