Program: 117878
Project: 117878
Buggy source:
/** 
 * Launch the process.
 */
public void exec(final Shell shell){
  if (process instanceof org.talend.designer.core.ui.editor.process.Process) {
    org.talend.designer.core.ui.editor.process.Process prs=(org.talend.designer.core.ui.editor.process.Process)process;
    prs.checkDifferenceWithRepository();
  }
  checkTraces();
  if (ProcessContextComposite.promptConfirmLauch(shell,getSelectedContext(),process)) {
    if (getSelectedTargetExecutionConfig() == null || !getSelectedTargetExecutionConfig().isRemote()) {
      IPreferenceStore preferenceStore=RunProcessPlugin.getDefault().getPreferenceStore();
      int num=preferenceStore.getInt(RunProcessTokenCollector.TOS_COUNT_RUNS.getPrefKey());
      preferenceStore.setValue(RunProcessTokenCollector.TOS_COUNT_RUNS.getPrefKey(),num + 1);
    }
    ClearPerformanceAction clearPerfAction=new ClearPerformanceAction();
    clearPerfAction.setProcess(process);
    clearPerfAction.run();
    ClearTraceAction clearTraceAction=new ClearTraceAction();
    clearTraceAction.setProcess(process);
    clearTraceAction.run();
    if (monitorPerf) {
      this.getStatisticsPort();
    }
    final IProcessor processor=getProcessor(process,process.getProperty());
    ((IEclipseProcessor)processor).setTargetExecutionConfig(getSelectedTargetExecutionConfig());
    IProgressService progressService=PlatformUI.getWorkbench().getProgressService();
    try {
      progressService.run(false,true,new IRunnableWithProgress(){
        @Override public void run(        final IProgressMonitor monitor){
          final IProgressMonitor progressMonitor=new EventLoopProgressMonitor(monitor);
          progressMonitor.beginTask(Messages.getString("String_Node_Str"),IProgressMonitor.UNKNOWN);
          testPort();
          if (monitorPerf || monitorTrace) {
            if (traceConnectionsManager != null) {
              traceConnectionsManager.clear();
            }
            traceConnectionsManager=getTraceConnectionsManager(process);
            traceConnectionsManager.init();
          }
          final IContext context=getSelectedContext();
          if (monitorPerf) {
            clearThreads();
            perfMonitor=getPerformanceMonitor();
            new Thread(perfMonitor,"String_Node_Str" + process.getLabel()).start();
            perMonitorList.add(perfMonitor);
          }
          if (monitorTrace) {
            traceMonitor=new TraceMonitor();
            new Thread(traceMonitor,"String_Node_Str" + process.getLabel()).start();
          }
          final String watchParam=RunProcessContext.this.isWatchAllowed() ? TalendProcessArgumentConstant.CMD_ARG_WATCH : null;
          final String log4jRuntimeLevel=getLog4jRuntimeLevel();
          processor.setContext(context);
          ((IEclipseProcessor)processor).setTargetExecutionConfig(getSelectedTargetExecutionConfig());
          final boolean oldMeasureActived=TimeMeasure.measureActive;
          if (!oldMeasureActived) {
            TimeMeasure.display=TimeMeasure.displaySteps=TimeMeasure.measureActive=CommonsPlugin.isDebugMode();
          }
          final String generateCodeId="String_Node_Str";
          TimeMeasure.begin(generateCodeId);
          try {
            ProcessorUtilities.generateCode(processor,process,context,getStatisticsPort() != IProcessor.NO_STATISTICS,getTracesPort() != IProcessor.NO_TRACES && hasConnectionTrace(),true,progressMonitor);
          }
 catch (          Throwable e) {
            running=true;
            MessageBoxExceptionHandler.process(e,Display.getDefault().getActiveShell());
            kill();
            return;
          }
 finally {
            progressMonitor.done();
          }
          TimeMeasure.end(generateCodeId);
          if (!oldMeasureActived) {
            TimeMeasure.display=TimeMeasure.displaySteps=TimeMeasure.measureActive=false;
          }
          final boolean[] refreshUiAndWait=new boolean[1];
          refreshUiAndWait[0]=true;
          final Display display=shell.getDisplay();
          new Thread(new Runnable(){
            @Override public void run(){
              display.syncExec(new Runnable(){
                @Override public void run(){
                  try {
                    startingMessageWritten=false;
                    if (!JobErrorsChecker.hasErrors(shell)) {
                      ps=processor.run(getStatisticsPort(),getTracesPort(),watchParam,log4jRuntimeLevel,progressMonitor,processMessageManager);
                    }
                    if (ps != null && !progressMonitor.isCanceled()) {
                      setRunning(true);
                      psMonitor=createProcessMonitor(ps);
                      startingMessageWritten=true;
                      final String startingPattern=Messages.getString("String_Node_Str");
                      MessageFormat mf=new MessageFormat(startingPattern);
                      String welcomeMsg=mf.format(new Object[]{process.getLabel(),new Date()});
                      processMessageManager.addMessage(new ProcessMessage(MsgType.CORE_OUT,welcomeMsg + "String_Node_Str"));
                      processMonitorThread=new Thread(psMonitor);
                      processMonitorThread.start();
                    }
 else {
                      kill();
                      running=true;
                      setRunning(false);
                    }
                  }
 catch (                  Throwable e) {
                    running=true;
                    Throwable cause=e.getCause();
                    if (cause != null && cause.getClass().equals(InterruptedException.class)) {
                      setRunning(false);
                      addErrorMessage(e);
                    }
 else {
                      ExceptionHandler.process(e);
                      addErrorMessage(e);
                      kill();
                    }
                  }
 finally {
                    refreshUiAndWait[0]=false;
                  }
                }
              }
);
            }
          }
,"String_Node_Str" + process.getLabel()).start();
          while (refreshUiAndWait[0] && !progressMonitor.isCanceled()) {
            if (!display.readAndDispatch()) {
              display.sleep();
            }
synchronized (this) {
              try {
                final long waitTime=50;
                wait(waitTime);
              }
 catch (              InterruptedException e) {
              }
            }
          }
        }
      }
);
    }
 catch (    InvocationTargetException e1) {
      addErrorMessage(e1);
    }
catch (    InterruptedException e1) {
      addErrorMessage(e1);
    }
  }
 else {
    this.running=true;
    setRunning(false);
  }
}

Fixed version (ground truth):
/** 
 * Launch the process.
 */
public void exec(final Shell shell){
  if (process instanceof org.talend.designer.core.ui.editor.process.Process) {
    org.talend.designer.core.ui.editor.process.Process prs=(org.talend.designer.core.ui.editor.process.Process)process;
    prs.checkDifferenceWithRepository();
  }
  checkTraces();
  if (ProcessContextComposite.promptConfirmLauch(shell,getSelectedContext(),process)) {
    if (getSelectedTargetExecutionConfig() == null || !getSelectedTargetExecutionConfig().isRemote()) {
      IPreferenceStore preferenceStore=RunProcessPlugin.getDefault().getPreferenceStore();
      int num=preferenceStore.getInt(RunProcessTokenCollector.TOS_COUNT_RUNS.getPrefKey());
      preferenceStore.setValue(RunProcessTokenCollector.TOS_COUNT_RUNS.getPrefKey(),num + 1);
    }
    ClearPerformanceAction clearPerfAction=new ClearPerformanceAction();
    clearPerfAction.setProcess(process);
    clearPerfAction.run();
    ClearTraceAction clearTraceAction=new ClearTraceAction();
    clearTraceAction.setProcess(process);
    clearTraceAction.run();
    if (monitorPerf) {
      this.getStatisticsPort();
    }
    final IProcessor processor=getProcessor(process,process.getProperty());
    ((IEclipseProcessor)processor).setTargetExecutionConfig(getSelectedTargetExecutionConfig());
    IProgressService progressService=PlatformUI.getWorkbench().getProgressService();
    try {
      progressService.run(false,true,new IRunnableWithProgress(){
        @Override public void run(        final IProgressMonitor monitor){
          final IProgressMonitor progressMonitor=new EventLoopProgressMonitor(monitor);
          progressMonitor.beginTask(Messages.getString("String_Node_Str"),IProgressMonitor.UNKNOWN);
          testPort();
          if (monitorPerf || monitorTrace) {
            if (traceConnectionsManager != null) {
              traceConnectionsManager.clear();
            }
            traceConnectionsManager=getTraceConnectionsManager(process);
            traceConnectionsManager.init();
          }
          final IContext context=getSelectedContext();
          if (monitorPerf) {
            clearThreads();
            perfMonitor=getPerformanceMonitor();
            new Thread(perfMonitor,"String_Node_Str" + process.getLabel()).start();
            perMonitorList.add(perfMonitor);
          }
          if (monitorTrace) {
            traceMonitor=new TraceMonitor();
            new Thread(traceMonitor,"String_Node_Str" + process.getLabel()).start();
          }
          final String watchParam=RunProcessContext.this.isWatchAllowed() ? TalendProcessArgumentConstant.CMD_ARG_WATCH : null;
          final String log4jRuntimeLevel=getLog4jRuntimeLevel();
          processor.setContext(context);
          ((IEclipseProcessor)processor).setTargetExecutionConfig(getSelectedTargetExecutionConfig());
          final boolean oldMeasureActived=TimeMeasure.measureActive;
          if (!oldMeasureActived) {
            TimeMeasure.display=TimeMeasure.displaySteps=TimeMeasure.measureActive=CommonsPlugin.isDebugMode();
          }
          final String generateCodeId="String_Node_Str";
          TimeMeasure.begin(generateCodeId);
          try {
            ProcessorUtilities.resetExportConfig();
            ProcessorUtilities.generateCode(processor,process,context,getStatisticsPort() != IProcessor.NO_STATISTICS,getTracesPort() != IProcessor.NO_TRACES && hasConnectionTrace(),true,progressMonitor);
          }
 catch (          Throwable e) {
            running=true;
            MessageBoxExceptionHandler.process(e,Display.getDefault().getActiveShell());
            kill();
            return;
          }
 finally {
            progressMonitor.done();
          }
          TimeMeasure.end(generateCodeId);
          if (!oldMeasureActived) {
            TimeMeasure.display=TimeMeasure.displaySteps=TimeMeasure.measureActive=false;
          }
          final boolean[] refreshUiAndWait=new boolean[1];
          refreshUiAndWait[0]=true;
          final Display display=shell.getDisplay();
          new Thread(new Runnable(){
            @Override public void run(){
              display.syncExec(new Runnable(){
                @Override public void run(){
                  try {
                    startingMessageWritten=false;
                    if (!JobErrorsChecker.hasErrors(shell)) {
                      ps=processor.run(getStatisticsPort(),getTracesPort(),watchParam,log4jRuntimeLevel,progressMonitor,processMessageManager);
                    }
                    if (ps != null && !progressMonitor.isCanceled()) {
                      setRunning(true);
                      psMonitor=createProcessMonitor(ps);
                      startingMessageWritten=true;
                      final String startingPattern=Messages.getString("String_Node_Str");
                      MessageFormat mf=new MessageFormat(startingPattern);
                      String welcomeMsg=mf.format(new Object[]{process.getLabel(),new Date()});
                      processMessageManager.addMessage(new ProcessMessage(MsgType.CORE_OUT,welcomeMsg + "String_Node_Str"));
                      processMonitorThread=new Thread(psMonitor);
                      processMonitorThread.start();
                    }
 else {
                      kill();
                      running=true;
                      setRunning(false);
                    }
                  }
 catch (                  Throwable e) {
                    running=true;
                    Throwable cause=e.getCause();
                    if (cause != null && cause.getClass().equals(InterruptedException.class)) {
                      setRunning(false);
                      addErrorMessage(e);
                    }
 else {
                      ExceptionHandler.process(e);
                      addErrorMessage(e);
                      kill();
                    }
                  }
 finally {
                    refreshUiAndWait[0]=false;
                  }
                }
              }
);
            }
          }
,"String_Node_Str" + process.getLabel()).start();
          while (refreshUiAndWait[0] && !progressMonitor.isCanceled()) {
            if (!display.readAndDispatch()) {
              display.sleep();
            }
synchronized (this) {
              try {
                final long waitTime=50;
                wait(waitTime);
              }
 catch (              InterruptedException e) {
              }
            }
          }
        }
      }
);
    }
 catch (    InvocationTargetException e1) {
      addErrorMessage(e1);
    }
catch (    InterruptedException e1) {
      addErrorMessage(e1);
    }
  }
 else {
    this.running=true;
    setRunning(false);
  }
}