Explicit timeout indication in ECL's resulting status.
diff --git a/ecl/plugins/org.eclipse.rcptt.ecl.core/src/org/eclipse/rcptt/ecl/core/util/Statuses.java b/ecl/plugins/org.eclipse.rcptt.ecl.core/src/org/eclipse/rcptt/ecl/core/util/Statuses.java
new file mode 100644
index 0000000..a59f272
--- /dev/null
+++ b/ecl/plugins/org.eclipse.rcptt.ecl.core/src/org/eclipse/rcptt/ecl/core/util/Statuses.java
@@ -0,0 +1,36 @@
+package org.eclipse.rcptt.ecl.core.util;
+
+import org.eclipse.core.runtime.IStatus;
+
+public class Statuses {
+	public interface Visitor {
+		/** @true is argument's children should be inspected too */
+		boolean visit(IStatus status);
+	}
+
+	public static void visit(IStatus status, Visitor visitor) {
+		if (status == null)
+			return;
+		if (visitor.visit(status)) {
+			if (status.isMultiStatus()) {
+				for (IStatus child : status.getChildren()) {
+					visit(child, visitor);
+				}
+			}
+		}
+	}
+
+	public static boolean hasCode(IStatus status, final int code) {
+		final boolean[] rv = new boolean[] { false };
+		visit(status, new Visitor() {
+
+			@Override
+			public boolean visit(IStatus status) {
+				if (status.getCode() == code)
+					rv[0] = true;
+				return !rv[0];
+			}
+		});
+		return rv[0];
+	}
+}
diff --git a/ecl/plugins/org.eclipse.rcptt.ecl.core/src/org/eclipse/rcptt/ecl/internal/core/Process.java b/ecl/plugins/org.eclipse.rcptt.ecl.core/src/org/eclipse/rcptt/ecl/internal/core/Process.java
index ba930f6..02cf306 100644
--- a/ecl/plugins/org.eclipse.rcptt.ecl.core/src/org/eclipse/rcptt/ecl/internal/core/Process.java
+++ b/ecl/plugins/org.eclipse.rcptt.ecl.core/src/org/eclipse/rcptt/ecl/internal/core/Process.java
@@ -58,7 +58,7 @@
 		while (status == null) {
 			long cur = System.currentTimeMillis();
 			if (timeout != 0 && (cur - start) > timeout) {
-				return status = new Status(IStatus.ERROR, CorePlugin.PLUGIN_ID,
+				return status = new Status(IStatus.ERROR, CorePlugin.PLUGIN_ID, TIMEOUT_CODE,
 						"Execution has timed out after " + (timeout/1000) + " seconds", null);
 			}
 			if (monitor.isCanceled()) {
diff --git a/ecl/plugins/org.eclipse.rcptt.ecl.core/src/org/eclipse/rcptt/ecl/runtime/IProcess.java b/ecl/plugins/org.eclipse.rcptt.ecl.core/src/org/eclipse/rcptt/ecl/runtime/IProcess.java
index 3315253..c513459 100644
--- a/ecl/plugins/org.eclipse.rcptt.ecl.core/src/org/eclipse/rcptt/ecl/runtime/IProcess.java
+++ b/ecl/plugins/org.eclipse.rcptt.ecl.core/src/org/eclipse/rcptt/ecl/runtime/IProcess.java
@@ -16,6 +16,8 @@
 
 public interface IProcess {
 
+	public static final int TIMEOUT_CODE = 123130;
+
 	IPipe getInput();
 
 	IPipe getOutput();
diff --git a/ecl/tests/org.eclipse.rcptt.ecl.core.tests/src/org/eclipse/rcptt/ecl/core/tests/StatusesTest.java b/ecl/tests/org.eclipse.rcptt.ecl.core.tests/src/org/eclipse/rcptt/ecl/core/tests/StatusesTest.java
new file mode 100644
index 0000000..524ca2a
--- /dev/null
+++ b/ecl/tests/org.eclipse.rcptt.ecl.core.tests/src/org/eclipse/rcptt/ecl/core/tests/StatusesTest.java
@@ -0,0 +1,32 @@
+package org.eclipse.rcptt.ecl.core.tests;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.rcptt.ecl.core.util.Statuses;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StatusesTest {
+
+	private static IStatus status(int severity, int code) {
+		return new Status(severity, "plugin", code, "", null);
+	}
+
+	private static MultiStatus multiStatus(int code) {
+		return new MultiStatus("plugin", code, "OK", null);
+	}
+
+	@Test
+	public void testHasCode() {
+		MultiStatus status = multiStatus(0);
+		status.add(status(0, 0));
+		Assert.assertFalse(Statuses.hasCode(status, 1));
+		status = multiStatus(0);
+		status.add(status(0, 1));
+		Assert.assertTrue(Statuses.hasCode(status, 1));
+		status = multiStatus(1);
+		Assert.assertTrue(Statuses.hasCode(status, 1));
+	}
+
+}