This is the mail archive of the
cygwin-developers
mailing list for the Cygwin project.
Cygwin's spawn/exec, mintty and the "Program Compatibility Assistant"
- From: Corinna Vinschen <corinna-cygwin at cygwin dot com>
- To: cygwin-developers at cygwin dot com
- Cc: Andy Koppe <andy dot koppe at gmail dot com>
- Date: Thu, 16 Feb 2012 13:46:26 +0100
- Subject: Cygwin's spawn/exec, mintty and the "Program Compatibility Assistant"
- Reply-to: cygwin-developers at cygwin dot com
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