From a4ea75600c2ec5f37f11fad360f71161ae6f878f Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Thu, 22 Dec 2011 14:33:08 +0000 Subject: [PATCH] * spawn.cc (child_info_spawn::worker): Add CREATE_BREAKAWAY_FROM_JOB to c_flags only if current process is member of a job and breakaway is allowed. --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/spawn.cc | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 586220188..afc2b3066 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,9 @@ +2011-12-22 Corinna Vinschen + + * spawn.cc (child_info_spawn::worker): Add CREATE_BREAKAWAY_FROM_JOB + to c_flags only if current process is member of a job and breakaway + is allowed. + 2011-12-22 Corinna Vinschen * external.cc (cygwin_internal): Implement CW_ALLOC_DRIVE_MAP, diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index a509e03cb..8a5a93935 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -452,6 +452,9 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv, c_flags = GetPriorityClass (GetCurrentProcess ()); sigproc_printf ("priority class %d", c_flags); + + c_flags |= CREATE_SEPARATE_WOW_VDM | CREATE_UNICODE_ENVIRONMENT; + /* We're adding the CREATE_BREAKAWAY_FROM_JOB flag here to workaround issues with the "Program Compatibility Assistant (PCA) Service" observed on Windows 7. For some reason, when starting long running sessions from @@ -461,8 +464,15 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv, mintty session, or to stop the PCA service. However, a process which is controlled by PCA is part of a compatibility job, which allows child processes to break away from the job. This helps to avoid this issue. */ - c_flags |= CREATE_SEPARATE_WOW_VDM | CREATE_UNICODE_ENVIRONMENT - | CREATE_BREAKAWAY_FROM_JOB; + 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))) + { + debug_printf ("Add CREATE_BREAKAWAY_FROM_JOB"); + c_flags |= CREATE_BREAKAWAY_FROM_JOB; + } if (mode == _P_DETACH) c_flags |= DETACHED_PROCESS; -- 2.43.5