![]() |
Subject: Cygwin's spawn/exec, mintty and the "Program Compatibility Assistant" Newsgroups: gmane.os.cygwin.devel Date: Thursday 16th February 2012 12:46:26 UTC (over 6 years ago) Hi guys, and especially Hi Andy, A couple of weeks ago we noticed this strange problem with mintty. The "Program Compatibility Assistant" (PCA) on W7 took it under its wings for no apparent reason, and if the session was long enough you would notice that a specific svchost process, the one running the Pcasvc service, would take more and more memory and CPU time. The solution for this problem was either to ask the user to switch off the PCA service, or a change in Cygwin's spawn/exec code. in short, PCA sets up a Job for a controlled application, but allows to breakaway from the job. That's what Cygwin now does in *every* invocation of spawn/exec: JOBOBJECT_BASIC_LIMIT_INFORMATION jobinfo; if (QueryInformationJobObject (NULL, JobObjectBasicLimitInformation, &jobinfo, sizeof jobinfo, NULL) && (jobinfo.LimitFlags & (JOB_OBJECT_LIMIT_BREAKAWAY_OK | JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK))) { /* Add CREATE_BREAKAWAY_FROM_JOB to the CreateProcess flags. */ c_flags |= CREATE_BREAKAWAY_FROM_JOB; } While this works, what bugs me is that this additional system call takes extra time and we all know that Cygwin is slow. Ask the users. I have still no idea why mintty is affected. It doesn't show up in the registry-based PCA database. Yesterday I found this on MSDN: http://msdn.microsoft.com/en-us/library/bb756937.aspx but I don't see anything there which would explain the effect for mintty. There's a section called "Detecting Program Failures Due to Deprecated Windows Components", maybe that's a hint? Apart from that, apparently there are multiple other ways to disable PCA from meddling with mintty. One of them is the (incorrectly documented) registry value HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\ExecutablesToExclude which is a REG_MULTI_SZ value you can fill with full paths to the exeutables to exclude. I tried that and it actually works. So, instead of calling QueryInformationJobObject for each spawn/exec, we could just add mintty.exe to that registry key. Or, alternatively, mintty could come with a builtin manifest. I just don't know how to include a manifest into a binary... Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Project Co-Leader cygwin AT cygwin DOT com Red Hat |
||