[ 
https://issues.apache.org/jira/browse/DAEMON-288?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13607480#comment-13607480
 ] 

Mladen Turk edited comment on DAEMON-288 at 3/20/13 10:30 AM:
--------------------------------------------------------------

Can you attach a patch against latest release (1.0.14 or braches/1.1.x).
>From your post I presume you have one.

                
      was (Author: [email protected]):
    Can you attach a patch against latest release (1.0.14 or trunk).
>From your post I presume you have one.

                  
> Hang while stopping procrun service
> -----------------------------------
>
>                 Key: DAEMON-288
>                 URL: https://issues.apache.org/jira/browse/DAEMON-288
>             Project: Commons Daemon
>          Issue Type: Bug
>          Components: Procrun
>    Affects Versions: 1.0.13
>         Environment: Windows 7 64 bit
>            Reporter: Mike Miller
>
> There is a hang of the procrun service while it is attempting to stop.  It is 
> not easy to reproduce ( 30%-5% depending on pc ).  Using a debugging to 
> analyze the hang, both the serviceMain() and serviceStop() threads appear to 
> have run and exited.  I can tell this from the state of the global variables 
> like gSargs and gShutdownEvents.  Looking at the code, both are calling 
> reportServiceStatus( SERVICE_STOPPED...).  Typically when either one reports 
> SERVICE_STOPPED, the main thread unblocks and the process terminates.  This 
> often occurs without both threads running to completion.  I think this is a 
> race condition caused by the reportServiceStatus() usage.  The MSDN 
> documentation for SetServiceStatus() states to only call SetServiceStatus() 
> with SERVICE_STOPPED after all cleanup has occurred and to only call it once. 
>  It appears that procrun has a race condition where 2 threads will both 
> attempt to report SERVICE_STOPPED and will likely report this while the other 
> thread is still running.  I believe this is the root cause of why the Service 
> Control Manager sometimes is unable to stop the service.   
>  
> As a potential solution, I modified serviceStop() to not call 
> reportServiceStatus(SERVICE_STOPPED...) and to move the SetEvent( 
> gShutdownEvent) to the end of the method.  This change allows the thread 
> running the  serviceStop() to complete.  Now the only method reporting 
> stopped is when serviceMain() exits.  With this refactoring to only report 
> SERVICE_STOPPED once (per MSDN) the hang has not been reproducible.  

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to