Interesting thought, and thanks for the feedback. It's worth taking a closer look at how MyClient is designed to make sure we didn't miss something that's causing this problem.
Our service is designed similarly to how you describe. MyClient is a control process/thread that is an object containing an org.quartz.Scheduler, which executes Jobs (which I believe are fundamentally threads) to perform tasks. MyClient also has a stop() method which, when the service is asked to stop, the Java Service Launcher passes the stop request by calling MyClient's stop() method. This method calls Scheduler.shutdown(), which tells the executing Jobs to stop and unloads any resources used by the Scheduler. I also know that the developer has actively tried to avoid/prevent the MyClient service from waiting for the bundle exe to terminate using this: Runtime.getRuntime().exec("cmd /c start /I /B " + installerFilePath + " -quiet -norestart -l*v " + installerFilePath + ".log"); return; Runtime.exec() returns a Process object on which we, if desired, could call .waitFor() to stop execution until the Process terminates. However, we don’t call Process.waitFor(), because we of course do not want to wait for the bundle exe to terminate, but instead want the Job to complete execution and terminate itself. And as you can see, we return immediately, which ends the Jobs execution. Thus, I don't think we're doing anything in MyClient that should wait for the bundle exe to finish. Furthermore, I'm not sure the problem is as simple as that, since our problem is *not* that our installer/bundle is hanging, waiting for the MyClient service to stop when it never does. The problem is that the package's Restart Manager is requesting a restart because completing the uninstall, because it thinks that "itself" (implying the bundle) is holding files in use that it needs to change, but it doesn't seem to realise that the bundle exe was executed from the Service, which it does knows will be shut down. I think it's just somehow unable to link the service (that is using file, but can and will be stopped) to the executing bundle. There may also be some complicated interactions between Java's spawning of processes and the Windows service infrastructure, since neither of them were ever originally intended to be used together. Fortunately, we have been able to consistently update MyClient from an external process, so we are currently splitting the updating functionality into a separate service, which should be able to shut down the services and run the installer to update the software from a dedicated updater. At least, that's the plan. Here's hoping it works, because I've been banging on this problem for too long! That said, if you or anyone has any other ideas or thoughts, please do fire away. I much prefer simpler solutions over more complicated ones, like having a separate dedicated updater (that now I need to worry about how to upgrade the updater, if need be :-P). So any more ideas are definitely very appreciated. Alain -----Original Message----- From: Phill Hogland [mailto:phogl...@rimage.com] Sent: July 4, 2013 11:27 To: wix-users@lists.sourceforge.net Subject: Re: [WiX-users] Upgrade uninstall restart issue As Rob indicated the dependency "loop" would not exist by default. It depends on how the designer implemented the MyClient service. A Windows Service should have a control handler thread that processes events from the Service Control Manager and separate worker thread(s) that implement the functionality of the service (such as calling CreateProcess to launch another application). The control thread must always run and process events from the SCM. If it becomes blocked the SCM will report an error against the service for not responding. If the SERVICE_CONTROL_STOP action cannot be implemented immediately the service should respond by setting the service's status to SERVICE_STOP_PENDING and incrementing the HintCounter to avoid a SCM timeout. Your theory would suggest that in addition to the worker thread calling CreateProcess to spawn the bundle (and then the bundle calling CreateProcess to spawn the package) the developer of the MyClient service implemented some code to wait for the bundle exe to terminate before it "allowed" the control handler thread to process an SCM event. (Not generally advisable, but maybe there is a good reason.) So your theory requires that a designer implement this behavior in the MyClient service. Your theory also assumes that the bundle exe has code to determine when the package has terminated, which I believe is correct. So that part of the loop is probably valid. The question however goes back to how the MyClient service is designed. -- View this message in context: http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Upgrade-uninstall-restart-issue-tp7586315p7587151.html Sent from the wix-users mailing list archive at Nabble.com. ------------------------------------------------------------------------------ This SF.net email is sponsored by Windows: Build for Windows Store. http://p.sf.net/sfu/windows-dev2dev _______________________________________________ WiX-users mailing list WiX-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/wix-users ------------------------------------------------------------------------------ This SF.net email is sponsored by Windows: Build for Windows Store. http://p.sf.net/sfu/windows-dev2dev _______________________________________________ WiX-users mailing list WiX-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/wix-users