From 09bf8f40360b40e1a27216de573c3c26338115d3 Mon Sep 17 00:00:00 2001 From: "Vladimir.Orlov" Date: Fri, 6 May 2016 12:56:12 +0300 Subject: [PATCH 1/5] run win32/64 exe launcher after installation in acoording to configured desktop shortcut. --- build/conf/nsis/idea.nsi | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/build/conf/nsis/idea.nsi b/build/conf/nsis/idea.nsi index 599c2d44ad21..10b3987062b0 100644 --- a/build/conf/nsis/idea.nsi +++ b/build/conf/nsis/idea.nsi @@ -316,6 +316,7 @@ Page custom uninstallOldVersionDialog Var productDir Var control_fields Var max_fields +Var runProductAfterInstall !ifdef LICENSE_FILE !insertmacro MUI_PAGE_LICENSE "$(myLicenseData)" @@ -348,7 +349,13 @@ InstallDir "$PROGRAMFILES\${MANUFACTURER}\${PRODUCT_WITH_VER}" BrandingText " " Function PageFinishRun -!insertmacro UAC_AsUser_ExecShell "" "$INSTDIR\bin\${PRODUCT_EXE_FILE}" "" "" "" + StrCmp $runProductAfterInstall "64" runExe64 runExe32 +runExe64: + !insertmacro UAC_AsUser_ExecShell "" "${PRODUCT_EXE_FILE_64}" "" "$INSTDIR\bin" "" + goto done +runExe32: + !insertmacro UAC_AsUser_ExecShell "" "${PRODUCT_EXE_FILE}" "" "$INSTDIR\bin" "" +done: FunctionEnd ;------------------------------------------------------------------------------ @@ -686,11 +693,13 @@ Section "IDEA Files" CopyIdeaFiles ; create shortcuts !insertmacro INSTALLOPTIONS_READ $R2 "Desktop.ini" "Field 2" "State" StrCmp $R2 1 "" exe_64 + StrCpy $runProductAfterInstall "32" CreateShortCut "$DESKTOP\${PRODUCT_FULL_NAME_WITH_VER}.lnk" \ "$INSTDIR\bin\${PRODUCT_EXE_FILE}" "" "" "" SW_SHOWNORMAL exe_64: !insertmacro INSTALLOPTIONS_READ $R2 "Desktop.ini" "Field 3" "State" StrCmp $R2 1 "" skip_desktop_shortcut + StrCpy $runProductAfterInstall "64" CreateShortCut "$DESKTOP\${PRODUCT_FULL_NAME_WITH_VER}(64).lnk" \ "$INSTDIR\bin\${PRODUCT_EXE_FILE_64}" "" "" "" SW_SHOWNORMAL From ff5b4979de8aa6f2e77cc93555872eaf749c3fff Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Fri, 6 May 2016 13:11:04 +0300 Subject: [PATCH 2/5] IDEA-131748 Stop debug session kills all processes - added a registry flag to disable winp usage and use taskkill --- .../execution/process/OSProcessUtil.java | 37 ++++++++++--------- .../util/resources/misc/registry.properties | 1 + .../execution/process/WinProcessManager.java | 14 ++++++- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/execution/process/OSProcessUtil.java b/platform/platform-impl/src/com/intellij/execution/process/OSProcessUtil.java index 1ab41a7fa0e6..4c24b93e0d6a 100644 --- a/platform/platform-impl/src/com/intellij/execution/process/OSProcessUtil.java +++ b/platform/platform-impl/src/com/intellij/execution/process/OSProcessUtil.java @@ -19,6 +19,7 @@ package com.intellij.execution.process; import com.intellij.execution.process.impl.ProcessListUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.util.registry.Registry; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jvnet.winp.WinProcess; @@ -27,17 +28,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -/****************************************************************************** - * Copyright (C) 2013 Fabio Zadrozny - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Fabio Zadrozny - initial API and implementation - ******************************************************************************/ public class OSProcessUtil { private static final Logger LOG = Logger.getInstance(OSProcessUtil.class); @@ -49,8 +39,12 @@ public class OSProcessUtil { public static boolean killProcessTree(@NotNull Process process) { if (SystemInfo.isWindows) { try { - WinProcess winProcess = createWinProcess(process); - winProcess.killRecursively(); + if (Registry.is("disable.winp")) { + WinProcessManager.kill(process, true); + } + else { + createWinProcess(process).killRecursively(); + } return true; } catch (Throwable e) { @@ -66,8 +60,12 @@ public class OSProcessUtil { public static void killProcess(@NotNull Process process) { if (SystemInfo.isWindows) { try { - WinProcess winProcess = createWinProcess(process); - winProcess.kill(); + if (Registry.is("disable.winp")) { + WinProcessManager.kill(process, false); + } + else { + createWinProcess(process).kill(); + } } catch (Throwable e) { LOG.info("Cannot kill process", e); @@ -77,11 +75,16 @@ public class OSProcessUtil { UnixProcessManager.sendSignal(UnixProcessManager.getProcessPid(process), UnixProcessManager.SIGKILL); } } - + public static int getProcessID(@NotNull Process process) { if (SystemInfo.isWindows) { try { - return createWinProcess(process).getPid(); + if (Registry.is("disable.winp")) { + WinProcessManager.getProcessPid(process); + } + else { + return createWinProcess(process).getPid(); + } } catch (Throwable e) { LOG.info("Cannot get process id", e); diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 5d57e3d0e771..50f50b06f13a 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -499,6 +499,7 @@ editor.injected.highlighting.enabled.description=Disables injected fragments hig run.processes.with.pty=false kill.windows.processes.softly=false output.reader.blocking.mode=false +disable.winp=false ide.certificate.manager=true diff --git a/platform/util/src/com/intellij/execution/process/WinProcessManager.java b/platform/util/src/com/intellij/execution/process/WinProcessManager.java index 5b7ef5e100d1..47f953e9b8a7 100644 --- a/platform/util/src/com/intellij/execution/process/WinProcessManager.java +++ b/platform/util/src/com/intellij/execution/process/WinProcessManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,8 @@ import com.sun.jna.Pointer; import com.sun.jna.platform.win32.Kernel32; import com.sun.jna.platform.win32.WinNT; +import java.io.IOException; + /** * @author Alexey.Ushakov */ @@ -49,4 +51,14 @@ public class WinProcessManager { throw new IllegalStateException("Unknown Process implementation"); } } + + /** + * Force kill a process (tree) + * @param process Windows process + * @param tree true to also kill all subprocesses + */ + public static void kill(Process process, boolean tree) throws IOException, InterruptedException { + int pid = getProcessPid(process); + Runtime.getRuntime().exec("taskkill /PID " + pid + (tree ? " /t" : "") + " /f").waitFor(); + } } From d53e968b86fd0ac33ffe33c0cd587b00a06d6876 Mon Sep 17 00:00:00 2001 From: Sergey Simonchik Date: Fri, 6 May 2016 13:16:21 +0300 Subject: [PATCH 3/5] log details to fight blinking test --- .../execution/impl/ExecutionManagerTest.java | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/platform/lang-impl/testSources/com/intellij/execution/impl/ExecutionManagerTest.java b/platform/lang-impl/testSources/com/intellij/execution/impl/ExecutionManagerTest.java index 7557f77a13ed..b6032ee43631 100644 --- a/platform/lang-impl/testSources/com/intellij/execution/impl/ExecutionManagerTest.java +++ b/platform/lang-impl/testSources/com/intellij/execution/impl/ExecutionManagerTest.java @@ -24,7 +24,9 @@ import com.intellij.execution.runners.ExecutionEnvironmentBuilder; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Conditions; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.testFramework.LightPlatformTestCase; +import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; @@ -91,14 +93,31 @@ public class ExecutionManagerTest extends LightPlatformTestCase { @NotNull private static FakeProcessHandler getProcessHandler(@NotNull ExecutionManagerImpl executionManager) { List descriptors = executionManager.getRunningDescriptors(Conditions.alwaysTrue()); - assertEquals(1, descriptors.size()); + String actualDescriptorsMsg = stringifyDescriptors(descriptors); + assertEquals(actualDescriptorsMsg, 1, descriptors.size()); RunContentDescriptor descriptor = ContainerUtil.getFirstItem(descriptors); - assertNotNull(descriptor); + assertNotNull(actualDescriptorsMsg, descriptor); ProcessHandler processHandler = descriptor.getProcessHandler(); - assertNotNull(processHandler); + assertNotNull(actualDescriptorsMsg, processHandler); return (FakeProcessHandler)processHandler; } + @NotNull + private static String stringifyDescriptors(@NotNull List descriptors) { + return "Actual descriptors: " + StringUtil.join(descriptors, new Function() { + @Override + public String fun(RunContentDescriptor descriptor) { + if (descriptor == null) { + return "null"; + } + ProcessHandler processHandler = descriptor.getProcessHandler(); + return String.format("[%s, %s]", + descriptor.getDisplayName(), + processHandler != null ? processHandler.getClass().getName() : null); + } + }, ", "); + } + @NotNull private static ExecutionEnvironment createEnv(@NotNull Project project, @NotNull RunnerAndConfigurationSettings settings) { return new ExecutionEnvironmentBuilder(project, DefaultRunExecutor.getRunExecutorInstance()) From 00d7570b5a86a543ae75db51131f68368b4599e4 Mon Sep 17 00:00:00 2001 From: Sergey Simonchik Date: Fri, 6 May 2016 13:43:18 +0300 Subject: [PATCH 4/5] update actions on process termination to have an immediate feedback --- .../execution/impl/ExecutionManagerImpl.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java index 82f7d430db52..eccc9a9c9dd7 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java @@ -31,6 +31,7 @@ import com.intellij.execution.runners.ProgramRunner; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.execution.ui.RunContentManager; import com.intellij.execution.ui.RunContentManagerImpl; +import com.intellij.execution.ui.RunnerLayoutUi; import com.intellij.ide.SaveAndSyncHandler; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.DataContext; @@ -389,7 +390,7 @@ public class ExecutionManagerImpl extends ExecutionManager implements Disposable } project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processStarted(executor.getId(), environment, processHandler); started = true; - processHandler.addProcessListener(new ProcessExecutionListener(project, profile, processHandler)); + processHandler.addProcessListener(new ProcessExecutionListener(project, profile, processHandler, descriptor)); } environment.setContentToReuse(descriptor); } @@ -567,16 +568,30 @@ public class ExecutionManagerImpl extends ExecutionManager implements Disposable private final Project myProject; private final RunProfile myProfile; private final ProcessHandler myProcessHandler; + private final RunContentDescriptor myDescriptor; - public ProcessExecutionListener(Project project, RunProfile profile, ProcessHandler processHandler) { + public ProcessExecutionListener(@NotNull Project project, + @NotNull RunProfile profile, + @NotNull ProcessHandler processHandler, + @NotNull RunContentDescriptor descriptor) { myProject = project; myProfile = profile; myProcessHandler = processHandler; + myDescriptor = descriptor; } @Override public void processTerminated(ProcessEvent event) { if (myProject.isDisposed()) return; + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + RunnerLayoutUi ui = myDescriptor.getRunnerLayoutUi(); + if (ui != null && !ui.isDisposed()) { + ui.updateActionsNow(); + } + } + }, ModalityState.any()); myProject.getMessageBus().syncPublisher(EXECUTION_TOPIC).processTerminated(myProfile, myProcessHandler); From b8384187d843c3e5cf17cf0ffbb39242ef199da3 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 6 May 2016 13:01:10 +0200 Subject: [PATCH 5/5] debugging TransactionTest --- .../com/intellij/application/TransactionTest.groovy | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/platform/platform-tests/testSrc/com/intellij/application/TransactionTest.groovy b/platform/platform-tests/testSrc/com/intellij/application/TransactionTest.groovy index bad43284d3c7..ad6915e41d6b 100644 --- a/platform/platform-tests/testSrc/com/intellij/application/TransactionTest.groovy +++ b/platform/platform-tests/testSrc/com/intellij/application/TransactionTest.groovy @@ -5,6 +5,7 @@ import com.intellij.openapi.application.impl.LaterInvocator import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.registry.Registry +import com.intellij.psi.impl.DebugUtil import com.intellij.testFramework.LightPlatformTestCase import com.intellij.testFramework.LoggedErrorProcessor import com.intellij.util.ui.UIUtil @@ -188,8 +189,12 @@ class TransactionTest extends LightPlatformTestCase { guard.submitTransaction testRootDisposable, id, { log << '5' } def nestedId = guard.contextTransaction SwingUtilities.invokeLater { - guard.submitTransaction testRootDisposable, nestedId, { log << '3' } - assert log == ['1', '2'] + String trace = null + guard.submitTransaction testRootDisposable, nestedId, { + trace = DebugUtil.currentStackTrace() + log << '3' + } + assert log == ['1', '2'] : log + " " + trace } UIUtil.dispatchAllInvocationEvents() }