summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/spawn.cc14
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,5 +1,11 @@
2011-12-22 Corinna Vinschen <vinschen@redhat.com>
+ * 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 <vinschen@redhat.com>
+
* external.cc (cygwin_internal): Implement CW_ALLOC_DRIVE_MAP,
CW_MAP_DRIVE_MAP, CW_FREE_DRIVE_MAP.
* fhandler_process.cc: Include mount.h.
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;