Hey Eric,

What's the purpose of that "Sleep(2000);"? Is it a debug leftover?

Cheers,
Pierre

Le 05/10/2018 à 08:43, Eric Kohl a écrit :
> https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f6d81f225747e4b1b3716e9ca8629f77dcc52b1a
> 
> commit f6d81f225747e4b1b3716e9ca8629f77dcc52b1a
> Author:     Eric Kohl <eric.k...@reactos.org>
> AuthorDate: Fri Oct 5 08:41:23 2018 +0200
> Commit:     Eric Kohl <eric.k...@reactos.org>
> CommitDate: Fri Oct 5 08:41:23 2018 +0200
> 
>     [SERVICES] Fix timeout when a service is stopped
>     
>     RSetServiceStatus: Send the stop command for the dispatcher thread from a 
> separate thread.
>     
>     Fixes CORE-15064
> ---
>  base/system/services/rpcserver.c | 59 
> ++++++++++++++++++++++++++++++++++------
>  1 file changed, 50 insertions(+), 9 deletions(-)
> 
> diff --git a/base/system/services/rpcserver.c 
> b/base/system/services/rpcserver.c
> index 7f251c8760..8e383a5bdc 100644
> --- a/base/system/services/rpcserver.c
> +++ b/base/system/services/rpcserver.c
> @@ -1671,6 +1671,43 @@ ScmIsValidServiceState(DWORD dwCurrentState)
>  }
>  
>  
> +static
> +DWORD
> +WINAPI
> +ScmStopThread(
> +    _In_ PVOID pParam)
> +{
> +    PSERVICE pService;
> +
> +    DPRINT("ScmStopThread(%p)\n", pParam);
> +
> +    pService = (PSERVICE)pParam;
> +
> +    if (pService->lpImage->dwImageRunCount != 0)
> +        return 0;
> +
> +    Sleep(2000);
> +
> +    /* Lock the service database exclusively */
> +    ScmLockDatabaseExclusive();
> +
> +    /* Stop the dispatcher thread */
> +    ScmControlService(pService->lpImage->hControlPipe,
> +                      L"",
> +                      (SERVICE_STATUS_HANDLE)pService,
> +                      SERVICE_CONTROL_STOP);
> +
> +    /* Remove the service image */
> +    ScmRemoveServiceImage(pService->lpImage);
> +
> +    /* Unlock the service database */
> +    ScmUnlockDatabase();
> +
> +    DPRINT("ScmStopThread done!\n");
> +    return 0;
> +}
> +
> +
>  /* Function 7 */
>  DWORD
>  WINAPI
> @@ -1683,6 +1720,8 @@ RSetServiceStatus(
>      DWORD dwPreviousType;
>      LPCWSTR lpLogStrings[2];
>      WCHAR szLogBuffer[80];
> +    HANDLE hStopThread = NULL;
> +    DWORD dwStopThreadId;
>      UINT uID;
>  
>      DPRINT("RSetServiceStatus() called\n");
> @@ -1762,15 +1801,17 @@ RSetServiceStatus(
>          /* If we just stopped the last running service... */
>          if (lpService->lpImage->dwImageRunCount == 0)
>          {
> -            /* Stop the dispatcher thread */
> -            ScmControlService(lpService->lpImage->hControlPipe,
> -                              L"",
> -                              (SERVICE_STATUS_HANDLE)lpService,
> -                              SERVICE_CONTROL_STOP);
> -
> -            /* Remove the service image */
> -            ScmRemoveServiceImage(lpService->lpImage);
> -            lpService->lpImage = NULL;
> +           /* Run the stop thread to stop the service dispatcher */
> +           hStopThread = CreateThread(NULL,
> +                                      0,
> +                                      (LPTHREAD_START_ROUTINE)ScmStopThread,
> +                                      (LPVOID)lpService,
> +                                      0,
> +                                      &dwStopThreadId);
> +           if (hStopThread != NULL)
> +           {
> +               CloseHandle(hStopThread);
> +           }
>          }
>      }
>  
> 


-- 
Pierre Schweitzer <pierre at reactos.org>
System & Network Administrator
Senior Kernel Developer
ReactOS Deutschland e.V.

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Ros-dev mailing list
Ros-dev@reactos.org
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to