-package org.opendaylight.controller.config.manager.impl;
+/*
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
-import org.opendaylight.controller.config.api.ModuleIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+package org.opendaylight.controller.config.manager.impl;
-import javax.annotation.Nullable;
-import javax.annotation.concurrent.GuardedBy;
import java.util.Deque;
import java.util.LinkedList;
import java.util.concurrent.TimeUnit;
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.GuardedBy;
+import org.opendaylight.controller.config.api.ModuleIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class DeadlockMonitor implements AutoCloseable {
- private static final Logger LOGGER = LoggerFactory.getLogger(DeadlockMonitorRunnable.class);
+ private static final Logger LOG = LoggerFactory.getLogger(DeadlockMonitor.class);
private static final long WARN_AFTER_MILLIS = 5000;
@GuardedBy("this")
private final Deque<ModuleIdentifierWithNanos> moduleIdentifierWithNanosStack = new LinkedList<>();
@GuardedBy("this")
- private ModuleIdentifierWithNanos top = ModuleIdentifierWithNanos.EMPTY;
+ private ModuleIdentifierWithNanos top = ModuleIdentifierWithNanos.empty;
- public DeadlockMonitor(TransactionIdentifier transactionIdentifier) {
+ public DeadlockMonitor(final TransactionIdentifier transactionIdentifier) {
this.transactionIdentifier = transactionIdentifier;
thread = new DeadlockMonitorRunnable();
thread.start();
}
- public synchronized void setCurrentlyInstantiatedModule(ModuleIdentifier currentlyInstantiatedModule) {
+ public synchronized void setCurrentlyInstantiatedModule(final ModuleIdentifier currentlyInstantiatedModule) {
boolean popping = currentlyInstantiatedModule == null;
if (popping) {
moduleIdentifierWithNanosStack.pop();
if (moduleIdentifierWithNanosStack.isEmpty()) {
- top = ModuleIdentifierWithNanos.EMPTY;
+ top = ModuleIdentifierWithNanos.empty;
} else {
top = moduleIdentifierWithNanosStack.peekLast();
}
moduleIdentifierWithNanosStack.push(current);
top = current;
}
- LOGGER.trace("setCurrentlyInstantiatedModule {}, top {}", currentlyInstantiatedModule, top);
+ LOG.trace("setCurrentlyInstantiatedModule {}, top {}", currentlyInstantiatedModule, top);
}
public boolean isAlive() {
@Override
public void run() {
- ModuleIdentifierWithNanos old = new ModuleIdentifierWithNanos(); // null moduleId
- while (this.isInterrupted() == false) {
- ModuleIdentifierWithNanos copy = new ModuleIdentifierWithNanos(DeadlockMonitor.this.top);
- if (old.moduleIdentifier == null || old.equals(copy) == false) {
+ // null moduleId
+ ModuleIdentifierWithNanos old = new ModuleIdentifierWithNanos();
+ while (!this.isInterrupted()) {
+ ModuleIdentifierWithNanos copy;
+ synchronized(this) {
+ copy = new ModuleIdentifierWithNanos(DeadlockMonitor.this.top);
+ }
+
+ if (old.moduleIdentifier == null || !old.equals(copy)) {
// started
old = copy;
} else {
// is the getInstance() running longer than WARN_AFTER_MILLIS ?
long runningTime = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - copy.nanoTime);
if (runningTime > WARN_AFTER_MILLIS) {
- LOGGER.warn("{} did not finish after {} ms", copy.moduleIdentifier, runningTime);
+ LOG.warn("{} did not finish after {} ms", copy.moduleIdentifier, runningTime);
}
}
try {
- sleep(1000);
- } catch (InterruptedException e) {
+ sleep(WARN_AFTER_MILLIS);
+ } catch (final InterruptedException e) {
interrupt();
}
}
- LOGGER.trace("Exiting {}", this);
+ LOG.trace("Exiting {}", this);
}
@Override
}
}
-
-
-
private static class ModuleIdentifierWithNanos {
- private static ModuleIdentifierWithNanos EMPTY = new ModuleIdentifierWithNanos();
+ private static ModuleIdentifierWithNanos empty = new ModuleIdentifierWithNanos();
@Nullable
private final ModuleIdentifier moduleIdentifier;
this((ModuleIdentifier)null);
}
- private ModuleIdentifierWithNanos(ModuleIdentifier moduleIdentifier) {
+ private ModuleIdentifierWithNanos(final ModuleIdentifier moduleIdentifier) {
this.moduleIdentifier = moduleIdentifier;
nanoTime = System.nanoTime();
}
- private ModuleIdentifierWithNanos(ModuleIdentifierWithNanos copy) {
+ private ModuleIdentifierWithNanos(final ModuleIdentifierWithNanos copy) {
moduleIdentifier = copy.moduleIdentifier;
nanoTime = copy.nanoTime;
}
@Override
- public boolean equals(Object o) {
+ public boolean equals(final Object o) {
if (this == o) {
return true;
}