From 57ecc0a8b937a6570c6e333ed402a388be0ffd2c Mon Sep 17 00:00:00 2001 From: "minkee.lee" Date: Tue, 29 Apr 2014 19:09:17 +0900 Subject: [PATCH] Bug fix: Sub process hangs due to full of buffer. When emulator-manager runs sub process which produces some output, sub process hangs because write buffer is fulled. So I fix it. Change-Id: I4883cf3e4f7cae402ffdec1cdae0e089a79ede98 Signed-off-by: minkee.lee --- .../emulator/manager/tool/CheckVirtualization.java | 60 ++++++++++++++++++++-- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/common-project/src/org/tizen/emulator/manager/tool/CheckVirtualization.java b/common-project/src/org/tizen/emulator/manager/tool/CheckVirtualization.java index 22eef46..e15d37c 100644 --- a/common-project/src/org/tizen/emulator/manager/tool/CheckVirtualization.java +++ b/common-project/src/org/tizen/emulator/manager/tool/CheckVirtualization.java @@ -29,8 +29,10 @@ package org.tizen.emulator.manager.tool; +import java.io.BufferedReader; import java.io.File; import java.io.IOException; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; @@ -146,8 +148,8 @@ public class CheckVirtualization { pb.directory(new File(FilePathResources.getBinPath())); try { - Process process = null; - process = pb.start(); + Process process = pb.start(); + ProcessOutputReader.startRead(process, "check-hax"); process.waitFor(); exitValue = process.exitValue(); EMLogger.getLogger().log(Level.CONFIG, "check-hax's exit value : " + exitValue); @@ -196,8 +198,8 @@ public class CheckVirtualization { pb.directory(new File(FilePathResources.getBinPath())); try { - Process process = null; - process = pb.start(); + Process process = pb.start(); + ProcessOutputReader.startRead(process, "check-gl"); process.waitFor(); exitValue = process.exitValue(); EMLogger.getLogger().log(Level.CONFIG, "'check-gl's exit value : " + exitValue); @@ -242,4 +244,52 @@ class CheckDialog { public void close() { dialog.close(); } -} \ No newline at end of file +} + +class ProcessOutputReader extends Thread { + + private BufferedReader reader; + private String processName; + private List msgList = new ArrayList(); + + public ProcessOutputReader(BufferedReader reader, String processName) { + this.reader = reader; + this.processName = processName; + this.setDaemon(true); + } + + // Read output/error stream of process to prevent blocking due to full of buffer. + public static void startRead(Process process, String processName) { + BufferedReader out = new BufferedReader(new InputStreamReader(process.getInputStream())); + new ProcessOutputReader(out, processName).start(); + + BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream())); + new ProcessOutputReader(err, processName).start(); + } + + @Override + public void run(){ + String msg; + try { + while ((msg = reader.readLine()) != null) { + msgList.add(msg); + } + } catch (IOException e) { + EMLogger.getLogger().warning(e.getMessage()); + } finally { + try { + reader.close(); + } catch (IOException e) { + EMLogger.getLogger().warning(e.getMessage()); + } + } + + if (!msgList.isEmpty()) { + EMLogger.getLogger().info(processName + "'s stdout/stderr"); + for (String s : msgList) { + EMLogger.getLogger().info(s); + } + msgList.clear(); + } + } +} -- 2.7.4