Author: tjwatson
Date: Fri Sep 9 13:37:58 2016
New Revision: 1760021
URL: http://svn.apache.org/viewvc?rev=1760021&view=rev
Log:
Merged latest trunk/subsystem changes to java6support branch.
Modified:
aries/branches/java6support/subsystem/ (props changed)
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/Activator.java
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/InstallAction.java
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/LockingStrategy.java
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartAction.java
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StopAction.java
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/UninstallAction.java
Propchange: aries/branches/java6support/subsystem/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Sep 9 13:37:58 2016
@@ -1,2 +1,2 @@
/aries/branches/1.0-prototype/subsystem:1306564-1337594
-/aries/trunk/subsystem:1728111-1759621
+/aries/trunk/subsystem:1728111-1760018
Modified:
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/Activator.java
URL:
http://svn.apache.org/viewvc/aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/Activator.java?rev=1760021&r1=1760020&r2=1760021&view=diff
==============================================================================
---
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/Activator.java
(original)
+++
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/Activator.java
Fri Sep 9 13:37:58 2016
@@ -46,6 +46,7 @@ import org.slf4j.LoggerFactory;
public class Activator implements BundleActivator,
ServiceTrackerCustomizer<Object, Object> {
private static final Logger logger =
LoggerFactory.getLogger(Activator.class);
public static final String MODELLED_RESOURCE_MANAGER =
"org.apache.aries.application.modelling.ModelledResourceManager";
+ private static final String LOCK_TIMEOUT =
"org.apache.aries.subsystem.lock.timeout";
public static final String LOG_ENTRY = "Method entry: {}, args {}";
public static final String LOG_EXIT = "Method exit: {}, returning {}";
@@ -59,6 +60,7 @@ public class Activator implements Bundle
}
private volatile BundleContext bundleContext;
+ private volatile LockingStrategy lockingStrategy;
private volatile ConfigAdminContentHandler configAdminHandler;
private volatile Coordinator coordinator;
private volatile Object modelledResourceManager;
@@ -79,6 +81,10 @@ public class Activator implements Bundle
return bundleContext;
}
+ public LockingStrategy getLockingStrategy() {
+ return lockingStrategy;
+ }
+
public Coordinator getCoordinator() {
return coordinator;
}
@@ -118,6 +124,7 @@ public class Activator implements Bundle
public synchronized void start(BundleContext context) throws Exception {
logger.debug(LOG_ENTRY, "start", context);
bundleContext = context;
+ lockingStrategy = new
LockingStrategy(bundleContext.getProperty(LOCK_TIMEOUT));
serviceTracker = new ServiceTracker<Object,
Object>(bundleContext, generateServiceFilter(), this);
serviceTracker.open();
logger.debug(LOG_EXIT, "start");
Modified:
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/InstallAction.java
URL:
http://svn.apache.org/viewvc/aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/InstallAction.java?rev=1760021&r1=1760020&r2=1760021&view=diff
==============================================================================
---
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/InstallAction.java
(original)
+++
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/InstallAction.java
Fri Sep 9 13:37:58 2016
@@ -46,7 +46,7 @@ public class InstallAction implements Pr
BasicSubsystem result = null;
// Acquire the global write lock to prevent all other
operations until
// the installation is complete. There is no need to hold any
other locks.
- LockingStrategy.writeLock();
+ Activator.getInstance().getLockingStrategy().writeLock();
try {
State state = parent.getState();
if (State.INSTALLING.equals(state)) {
@@ -101,7 +101,7 @@ public class InstallAction implements Pr
}
finally {
// Release the global write lock.
- LockingStrategy.writeUnlock();
+
Activator.getInstance().getLockingStrategy().writeUnlock();
}
return result;
}
Modified:
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/LockingStrategy.java
URL:
http://svn.apache.org/viewvc/aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/LockingStrategy.java?rev=1760021&r1=1760020&r2=1760021&view=diff
==============================================================================
---
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/LockingStrategy.java
(original)
+++
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/LockingStrategy.java
Fri Sep 9 13:37:58 2016
@@ -15,20 +15,32 @@ import org.osgi.service.subsystem.Subsys
import org.osgi.service.subsystem.SubsystemException;
public class LockingStrategy {
- private static final int TRY_LOCK_TIME = 30000;
- private static final TimeUnit TRY_LOCK_TIME_UNIT =
TimeUnit.MILLISECONDS;
-
+ private final int TRY_LOCK_TIME;
+ private final TimeUnit TRY_LOCK_TIME_UNIT = TimeUnit.SECONDS;
+
+ public LockingStrategy(String tryLockTime) {
+ int value = 600; // ten mins by default
+ if (tryLockTime != null) {
+ try {
+ value = Integer.parseInt(tryLockTime);
+ } catch (NumberFormatException e) {
+ // ignore, the default will be used
+ }
+ }
+ TRY_LOCK_TIME = value;
+ }
+
/*
* A mutual exclusion lock used when acquiring the state change locks of
* a collection of subsystems in order to prevent cycle deadlocks.
*/
- private static final ReentrantLock lock = new ReentrantLock();
+ private final ReentrantLock lock = new ReentrantLock();
/*
* Used when the state change lock of a subsystem cannot be acquired.
All
* other state change locks are released while waiting. The condition
is met
* whenever the state change lock of one or more subsystems is released.
*/
- private static final Condition condition = lock.newCondition();
+ private final Condition condition = lock.newCondition();
/*
* Allow only one of the following operations to be executing at the
same
@@ -45,16 +57,16 @@ public class LockingStrategy {
* (2) Start
* (3) Stop
*/
- private static final ReentrantReadWriteLock rwlock = new
ReentrantReadWriteLock();
+ private final ReentrantReadWriteLock rwlock = new
ReentrantReadWriteLock();
- private static final ThreadLocal<Map<Subsystem.State,
Set<BasicSubsystem>>> local = new ThreadLocal<Map<Subsystem.State,
Set<BasicSubsystem>>>() {
+ private final ThreadLocal<Map<Subsystem.State, Set<BasicSubsystem>>>
local = new ThreadLocal<Map<Subsystem.State, Set<BasicSubsystem>>>() {
@Override
protected Map<Subsystem.State, Set<BasicSubsystem>>
initialValue() {
return new HashMap<Subsystem.State,
Set<BasicSubsystem>>();
}
};
- public static void lock() {
+ public void lock() {
try {
if (!lock.tryLock(TRY_LOCK_TIME, TRY_LOCK_TIME_UNIT)) {
throw new SubsystemException("Unable to acquire
the global mutual exclusion lock in time.");
@@ -65,11 +77,11 @@ public class LockingStrategy {
}
}
- public static void unlock() {
+ public void unlock() {
lock.unlock();
}
- public static void lock(Collection<BasicSubsystem> subsystems) {
+ public void lock(Collection<BasicSubsystem> subsystems) {
Collection<BasicSubsystem> locked = new
ArrayList<BasicSubsystem>(subsystems.size());
try {
while (locked.size() < subsystems.size()) {
@@ -77,7 +89,7 @@ public class LockingStrategy {
if
(!subsystem.stateChangeLock().tryLock()) {
unlock(locked);
locked.clear();
- if
(!LockingStrategy.condition.await(TRY_LOCK_TIME, TimeUnit.SECONDS)) {
+ if
(!condition.await(TRY_LOCK_TIME, TimeUnit.SECONDS)) {
throw new
SubsystemException("Unable to acquire the state change lock in time: " +
subsystem);
}
break;
@@ -92,14 +104,14 @@ public class LockingStrategy {
}
}
- public static void unlock(Collection<BasicSubsystem> subsystems) {
+ public void unlock(Collection<BasicSubsystem> subsystems) {
for (BasicSubsystem subsystem : subsystems) {
subsystem.stateChangeLock().unlock();
}
signalAll();
}
- private static void signalAll() {
+ private void signalAll() {
lock();
try {
condition.signalAll();
@@ -109,7 +121,7 @@ public class LockingStrategy {
}
}
- public static boolean set(Subsystem.State state, BasicSubsystem
subsystem) {
+ public boolean set(Subsystem.State state, BasicSubsystem subsystem) {
Map<Subsystem.State, Set<BasicSubsystem>> map = local.get();
Set<BasicSubsystem> subsystems = map.get(state);
if (subsystems == null) {
@@ -124,7 +136,7 @@ public class LockingStrategy {
return true;
}
- public static void unset(Subsystem.State state, BasicSubsystem
subsystem) {
+ public void unset(Subsystem.State state, BasicSubsystem subsystem) {
Map<Subsystem.State, Set<BasicSubsystem>> map = local.get();
Set<BasicSubsystem> subsystems = map.get(state);
if (subsystems != null) {
@@ -132,7 +144,7 @@ public class LockingStrategy {
}
}
- public static void readLock() {
+ public void readLock() {
try {
if (!rwlock.readLock().tryLock(TRY_LOCK_TIME,
TRY_LOCK_TIME_UNIT)) {
throw new SubsystemException("Unable to acquire
the global read lock in time.");
@@ -143,11 +155,11 @@ public class LockingStrategy {
}
}
- public static void readUnlock() {
+ public void readUnlock() {
rwlock.readLock().unlock();
}
- public static void writeLock() {
+ public void writeLock() {
try {
if (!rwlock.writeLock().tryLock(TRY_LOCK_TIME,
TRY_LOCK_TIME_UNIT)) {
throw new SubsystemException("Unable to acquire
the global write lock in time.");
@@ -158,7 +170,7 @@ public class LockingStrategy {
}
}
- public static void writeUnlock() {
+ public void writeUnlock() {
rwlock.writeLock().unlock();
}
}
Modified:
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartAction.java
URL:
http://svn.apache.org/viewvc/aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartAction.java?rev=1760021&r1=1760020&r2=1760021&view=diff
==============================================================================
---
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartAction.java
(original)
+++
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartAction.java
Fri Sep 9 13:37:58 2016
@@ -197,7 +197,7 @@ public class StartAction extends Abstrac
@Override
public Object run() {
// Protect against re-entry now that cycles are supported.
- if (!LockingStrategy.set(State.STARTING, target)) {
+ if
(!Activator.getInstance().getLockingStrategy().set(State.STARTING, target)) {
return null;
}
try {
@@ -206,7 +206,7 @@ public class StartAction extends Abstrac
// If necessary, install the dependencies.
if (State.INSTALLING.equals(target.getState()) &&
!Utils.isProvisionDependenciesInstall(target)) {
// Acquire the global write lock while installing
dependencies.
- LockingStrategy.writeLock();
+
Activator.getInstance().getLockingStrategy().writeLock();
try {
// We are now protected against
installs, starts, stops, and uninstalls.
// We need a separate coordination when
installing
@@ -228,7 +228,7 @@ public class StartAction extends Abstrac
}
// Downgrade to the read lock
in order to prevent
// installs and uninstalls but allow
starts and stops.
- LockingStrategy.readLock();
+
Activator.getInstance().getLockingStrategy().readLock();
}
catch (Throwable t) {
c.fail(t);
@@ -241,13 +241,13 @@ public class StartAction extends Abstrac
}
finally {
// Release the global write lock as
soon as possible.
- LockingStrategy.writeUnlock();
+
Activator.getInstance().getLockingStrategy().writeUnlock();
}
}
else {
// Acquire the read lock in order to prevent installs
and
// uninstalls but allow starts and stops.
- LockingStrategy.readLock();
+ Activator.getInstance().getLockingStrategy().readLock();
}
try {
// We now hold the read lock and are protected against
installs
@@ -263,15 +263,15 @@ public class StartAction extends Abstrac
affectedResources = computeAffectedResources(target);
// Acquire the global mutual exclusion lock
while acquiring the
// state change locks of affected subsystems.
- LockingStrategy.lock();
+
Activator.getInstance().getLockingStrategy().lock();
try {
// We are now protected against cycles.
// Acquire the state change locks of
affected subsystems.
-
LockingStrategy.lock(affectedResources.subsystems());
+
Activator.getInstance().getLockingStrategy().lock(affectedResources.subsystems());
}
finally {
// Release the global mutual exclusion
lock as soon as possible.
- LockingStrategy.unlock();
+
Activator.getInstance().getLockingStrategy().unlock();
}
Coordination coordination = this.coordination;
try {
@@ -323,13 +323,13 @@ public class StartAction extends Abstrac
}
finally {
// Release the state change
locks of affected subsystems.
-
LockingStrategy.unlock(affectedResources.subsystems());
+
Activator.getInstance().getLockingStrategy().unlock(affectedResources.subsystems());
}
}
}
finally {
// Release the read lock.
- LockingStrategy.readUnlock();
+
Activator.getInstance().getLockingStrategy().readUnlock();
}
}
catch (CoordinationException e) {
@@ -347,7 +347,7 @@ public class StartAction extends Abstrac
}
finally {
// Protection against re-entry no longer required.
- LockingStrategy.unset(State.STARTING, target);
+
Activator.getInstance().getLockingStrategy().unset(State.STARTING, target);
}
return null;
}
Modified:
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StopAction.java
URL:
http://svn.apache.org/viewvc/aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StopAction.java?rev=1760021&r1=1760020&r2=1760021&view=diff
==============================================================================
---
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StopAction.java
(original)
+++
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StopAction.java
Fri Sep 9 13:37:58 2016
@@ -44,14 +44,14 @@ public class StopAction extends Abstract
@Override
public Object run() {
// Protect against re-entry now that cycles are supported.
- if (!LockingStrategy.set(State.STOPPING, target)) {
+ if
(!Activator.getInstance().getLockingStrategy().set(State.STOPPING, target)) {
return null;
}
try {
// We are now protected against re-entry.
// Acquire the global read lock to prevent installs and
uninstalls
// but allow starts and stops.
- LockingStrategy.readLock();
+ Activator.getInstance().getLockingStrategy().readLock();
try {
// We are now protected against installs and
uninstalls.
checkRoot();
@@ -68,15 +68,15 @@ public class StopAction extends Abstract
}
// Acquire the global mutual exclusion lock
while acquiring the
// state change locks of affected subsystems.
- LockingStrategy.lock();
+
Activator.getInstance().getLockingStrategy().lock();
try {
// We are now protected against cycles.
// Acquire the state change locks of
affected subsystems.
- LockingStrategy.lock(subsystems);
+
Activator.getInstance().getLockingStrategy().lock(subsystems);
}
finally {
// Release the global mutual exclusion
lock as soon as possible.
- LockingStrategy.unlock();
+
Activator.getInstance().getLockingStrategy().unlock();
}
try {
// We are now protected against other
starts and stops of the affected subsystems.
@@ -128,17 +128,17 @@ public class StopAction extends Abstract
}
finally {
// Release the state change locks of
affected subsystems.
- LockingStrategy.unlock(subsystems);
+
Activator.getInstance().getLockingStrategy().unlock(subsystems);
}
}
finally {
// Release the read lock.
- LockingStrategy.readUnlock();
+
Activator.getInstance().getLockingStrategy().readUnlock();
}
}
finally {
// Protection against re-entry no longer required.
- LockingStrategy.unset(State.STOPPING, target);
+
Activator.getInstance().getLockingStrategy().unset(State.STOPPING, target);
}
return null;
}
Modified:
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/UninstallAction.java
URL:
http://svn.apache.org/viewvc/aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/UninstallAction.java?rev=1760021&r1=1760020&r2=1760021&view=diff
==============================================================================
---
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/UninstallAction.java
(original)
+++
aries/branches/java6support/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/UninstallAction.java
Fri Sep 9 13:37:58 2016
@@ -25,14 +25,14 @@ public class UninstallAction extends Abs
@Override
public Object run() {
// Protect against re-entry now that cycles are supported.
- if (!LockingStrategy.set(State.UNINSTALLING, target)) {
+ if
(!Activator.getInstance().getLockingStrategy().set(State.UNINSTALLING, target))
{
return null;
}
try {
// Acquire the global write lock to prevent all other
operations
// until the uninstall is complete. There is no need to
hold any
// other locks.
- LockingStrategy.writeLock();
+
Activator.getInstance().getLockingStrategy().writeLock();
try {
checkRoot();
checkValid();
@@ -47,12 +47,12 @@ public class UninstallAction extends Abs
}
finally {
// Release the global write lock.
- LockingStrategy.writeUnlock();
+
Activator.getInstance().getLockingStrategy().writeUnlock();
}
}
finally {
// Protection against re-entry no longer required.
- LockingStrategy.unset(State.UNINSTALLING, target);
+
Activator.getInstance().getLockingStrategy().unset(State.UNINSTALLING, target);
}
return null;
}