Bug fix: Sub process hangs due to full of buffer.
authorminkee.lee <minkee.lee@samsung.com>
Tue, 29 Apr 2014 10:09:17 +0000 (19:09 +0900)
committerminkee.lee <minkee.lee@samsung.com>
Wed, 14 May 2014 08:43:36 +0000 (17:43 +0900)
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 <minkee.lee@samsung.com>
common-project/src/org/tizen/emulator/manager/tool/CheckVirtualization.java

index 22eef46..e15d37c 100644 (file)
 
 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<String> msgList = new ArrayList<String>();
+
+       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();
+               }
+       }
+}