01: /*
02:
03: Derby - Class org.apache.derbyTesting.functionTests.harness.TimedProcess
04:
05: Licensed to the Apache Software Foundation (ASF) under one or more
06: contributor license agreements. See the NOTICE file distributed with
07: this work for additional information regarding copyright ownership.
08: The ASF licenses this file to You under the Apache License, Version 2.0
09: (the "License"); you may not use this file except in compliance with
10: the License. You may obtain a copy of the License at
11:
12: http://www.apache.org/licenses/LICENSE-2.0
13:
14: Unless required by applicable law or agreed to in writing, software
15: distributed under the License is distributed on an "AS IS" BASIS,
16: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17: See the License for the specific language governing permissions and
18: limitations under the License.
19:
20: */
21:
22: package org.apache.derbyTesting.functionTests.harness;
23:
24: /**
25: * This class is a wrapper of Process to provide a waitFor() method
26: * that forcibly terminates the process if it does not
27: * complete within the specified time.
28: *
29: * @author Phil Lopez
30: *
31: */
32: public class TimedProcess {
33:
34: private Process process;
35:
36: public TimedProcess(Process process) {
37: this .process = process;
38: }
39:
40: public int waitFor(int sec) {
41: int exitValue = -1;
42:
43: // Create a thread to wait for the process to die
44: WaitForProcess t = new WaitForProcess(process);
45: t.start();
46:
47: // Give the process sec seconds to terminate
48: try {
49: t.join(sec * 1000);
50:
51: // Otherwise, interrupt the thread...
52: if (t.isAlive()) {
53: t.interrupt();
54:
55: System.err
56: .println("Server Process did not complete in time. Destroying...");
57: // ...and destroy the process with gusto
58: process.destroy();
59: } else {
60: // process shut down, so it is right to get the exit value from it
61: exitValue = t.getProcessExitValue();
62: }
63: } catch (InterruptedException e) {
64: e.printStackTrace();
65: }
66:
67: return exitValue;
68: }
69: } // public class TimedProcess
70:
71: class WaitForProcess extends Thread {
72: private Process process;
73: private int processExitValue;
74:
75: public WaitForProcess(Process process) {
76: this .process = process;
77: }
78:
79: public int getProcessExitValue() {
80: return processExitValue;
81: }
82:
83: public void run() {
84: // Our whole goal in life here is to waitFor() the process.
85: // However, we're actually going to catch the InterruptedException for it!
86: try {
87: processExitValue = process.waitFor();
88: } catch (InterruptedException e) {
89: // Don't do anything here; the thread will die of natural causes
90: }
91: }
92: } // class WaitForProcess
|