cleanup start/stop methods w/ timeout arg to reuse code and hence behave the same
This commit is contained in:
parent
ff25200d99
commit
bf281b55b6
|
@ -209,34 +209,58 @@ public class Service extends Win32 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class Waiter {
|
||||||
|
long start = System.currentTimeMillis();
|
||||||
|
Service service;
|
||||||
|
long timeout;
|
||||||
|
int wantedState;
|
||||||
|
int pendingState;
|
||||||
|
|
||||||
|
Waiter(Service service,
|
||||||
|
long timeout,
|
||||||
|
int wantedState,
|
||||||
|
int pendingState)
|
||||||
|
{
|
||||||
|
this.service = service;
|
||||||
|
this.timeout = timeout;
|
||||||
|
this.wantedState = wantedState;
|
||||||
|
this.pendingState = pendingState;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean sleep() {
|
||||||
|
int status;
|
||||||
|
while ((status = service.getStatus()) != this.wantedState) {
|
||||||
|
if (status != this.pendingState) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((timeout <= 0) ||
|
||||||
|
((System.currentTimeMillis() - this.start) < this.timeout))
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
Thread.sleep(100);
|
||||||
|
} catch(InterruptedException e) {}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return status == this.wantedState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void stop(long timeout) throws Win32Exception
|
public void stop(long timeout) throws Win32Exception
|
||||||
{
|
{
|
||||||
long status;
|
long status;
|
||||||
|
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
long start = System.currentTimeMillis();
|
Waiter waiter =
|
||||||
|
new Waiter(this, timeout, SERVICE_STOPPED, SERVICE_STOP_PENDING);
|
||||||
|
|
||||||
while ((status = getStatus()) != SERVICE_STOPPED) {
|
if (!waiter.sleep()) {
|
||||||
if (status == SERVICE_STOP_PENDING) {
|
throw new Win32Exception("Failed to stop service");
|
||||||
// The start hasn't completed yet. Keep trying up to
|
|
||||||
// the timeout.
|
|
||||||
if (((System.currentTimeMillis() - start) < timeout) ||
|
|
||||||
(timeout <= 0))
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
Thread.sleep(100);
|
|
||||||
} catch(InterruptedException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (status != SERVICE_STOPPED) {
|
|
||||||
throw getLastErrorException();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -249,38 +273,15 @@ public class Service extends Win32 {
|
||||||
|
|
||||||
public void start(long timeout) throws Win32Exception
|
public void start(long timeout) throws Win32Exception
|
||||||
{
|
{
|
||||||
long status;
|
long status;
|
||||||
boolean result = true;
|
|
||||||
long start = System.currentTimeMillis();
|
|
||||||
|
|
||||||
while ((status = getStatus()) != SERVICE_RUNNING) {
|
|
||||||
if (status == SERVICE_START_PENDING) {
|
|
||||||
// The start hasn't completed yet. Keep trying up to
|
|
||||||
// the timeout.
|
|
||||||
if (((System.currentTimeMillis() - start) < timeout) ||
|
|
||||||
(timeout <= 0))
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
Thread.sleep(100);
|
|
||||||
} catch(InterruptedException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
result = false;
|
|
||||||
}
|
|
||||||
} else if (status == SERVICE_STOPPED) {
|
|
||||||
// Start failed
|
|
||||||
result = false;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
// Hrm.
|
|
||||||
result = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result == false) {
|
start();
|
||||||
throw getLastErrorException();
|
|
||||||
|
Waiter waiter =
|
||||||
|
new Waiter(this, timeout, SERVICE_RUNNING, SERVICE_START_PENDING);
|
||||||
|
|
||||||
|
if (!waiter.sleep()) {
|
||||||
|
throw new Win32Exception("Failed to start service");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,6 +343,20 @@ public class Service extends Win32 {
|
||||||
if (args.length == 0) {
|
if (args.length == 0) {
|
||||||
services = getServiceNames();
|
services = getServiceNames();
|
||||||
}
|
}
|
||||||
|
else if ((args.length == 2) && (args[0].equals("-toggle"))) {
|
||||||
|
long timeout = 5 * 1000; //5 seconds
|
||||||
|
Service service = new Service(args[1]);
|
||||||
|
if (service.getStatus() == SERVICE_RUNNING) {
|
||||||
|
System.out.println("Stopping service...");
|
||||||
|
service.stop(timeout);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
System.out.println("Starting service...");
|
||||||
|
service.start(timeout);
|
||||||
|
}
|
||||||
|
System.out.println(service.getStatusString());
|
||||||
|
return;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
services = Arrays.asList(args);
|
services = Arrays.asList(args);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue