diff --git a/platform/platform-impl/src/com/intellij/idea/StartupUtil.java b/platform/platform-impl/src/com/intellij/idea/StartupUtil.java index 45398a1617b9..eb54502b7996 100644 --- a/platform/platform-impl/src/com/intellij/idea/StartupUtil.java +++ b/platform/platform-impl/src/com/intellij/idea/StartupUtil.java @@ -178,7 +178,10 @@ public class StartupUtil { static void fixProcessEnvironment(Logger log) { - log.info("initializing " + EnvironmentUtil.class.getName()); + boolean envReady = EnvironmentUtil.isEnvironmentReady(); // trigger environment loading + if (!envReady) { + log.info("initializing environment"); + } } diff --git a/platform/util/src/com/intellij/util/EnvironmentUtil.java b/platform/util/src/com/intellij/util/EnvironmentUtil.java index 82ca97651d05..c6fe95800f07 100644 --- a/platform/util/src/com/intellij/util/EnvironmentUtil.java +++ b/platform/util/src/com/intellij/util/EnvironmentUtil.java @@ -15,6 +15,7 @@ */ package com.intellij.util; +import com.intellij.execution.process.UnixProcessManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.AtomicNotNullLazyValue; import com.intellij.openapi.util.NotNullLazyValue; @@ -40,7 +41,7 @@ public class EnvironmentUtil { private static final Future> ourEnvGetter; static { - boolean readShellEnv = SystemInfo.isMac && SystemProperties.getBooleanProperty("idea.fix.mac.env", false); // todo: UI setting? + boolean readShellEnv = SystemInfo.isMac && SystemProperties.getBooleanProperty("idea.fix.mac.env", true); if (readShellEnv) { ExecutorService executor = Executors.newSingleThreadExecutor(); ourEnvGetter = executor.submit(new Callable>() { @@ -84,9 +85,13 @@ public class EnvironmentUtil { private EnvironmentUtil() { } + public static boolean isEnvironmentReady() { + return ourEnvGetter.isDone(); + } + /** - * Returns the process environment. On Mac OS X, a shell environment is returned if - * todo: some property is set. + * Returns the process environment. + * On Mac OS X a shell (Terminal.app) environment is returned (unless disabled by a system property). * * @return unmodifiable map of the process environment. */ @@ -135,7 +140,7 @@ public class EnvironmentUtil { processKiller.killAfter(SHELL_ENV_READING_TIMEOUT); List lines = FileUtil.loadLines(process.getInputStream()); processKiller.stopWaiting(); - int rv = process.exitValue(); + int rv = process.waitFor(); if (rv != 0 || lines.isEmpty()) { throw new Exception("rv:" + rv + " lines:" + lines.size()); } @@ -161,6 +166,7 @@ public class EnvironmentUtil { throw new Exception("env:" + newEnv.size() + " lines:" + lines.size()); } + LOG.info("shell environment loaded (" + newEnv.size() + " vars)"); return Collections.unmodifiableMap(newEnv); } catch (Throwable t) { @@ -201,7 +207,7 @@ public class EnvironmentUtil { myProcess.exitValue(); } catch (IllegalThreadStateException e) { - myProcess.destroy(); + UnixProcessManager.sendSigIntToProcessTree(myProcess); LOG.warn("timed out"); } }