Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2012-10-06 16:52:17 +0000
committerEike Stepper2012-10-06 16:52:17 +0000
commit37a154024bfd5ce49557e18675cbd79cb44acd99 (patch)
treeb2015c5e985ef4315e1d17b95f3bc584f3f09c24
parent7a7b5e32cf39247c89f652a6595258aa8ec9634a (diff)
downloadcdo-37a154024bfd5ce49557e18675cbd79cb44acd99.tar.gz
cdo-37a154024bfd5ce49557e18675cbd79cb44acd99.tar.xz
cdo-37a154024bfd5ce49557e18675cbd79cb44acd99.zip
[391294] Provide a ShareableLifecycle
https://bugs.eclipse.org/bugs/show_bug.cgi?id=391294
-rw-r--r--plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/container/Container.java13
-rw-r--r--plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/lifecycle/Lifecycle.java14
-rw-r--r--plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/lifecycle/ShareableLifecycle.java57
3 files changed, 80 insertions, 4 deletions
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/container/Container.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/container/Container.java
index 3dbf3a7d65..aa2b71f51a 100644
--- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/container/Container.java
+++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/container/Container.java
@@ -13,7 +13,7 @@ package org.eclipse.net4j.util.container;
import org.eclipse.net4j.util.container.IContainerDelta.Kind;
import org.eclipse.net4j.util.event.IEvent;
import org.eclipse.net4j.util.lifecycle.ILifecycle;
-import org.eclipse.net4j.util.lifecycle.Lifecycle;
+import org.eclipse.net4j.util.lifecycle.ShareableLifecycle;
import java.util.List;
@@ -22,10 +22,19 @@ import java.util.List;
*
* @author Eike Stepper
*/
-public abstract class Container<E> extends Lifecycle implements IContainer<E>
+public abstract class Container<E> extends ShareableLifecycle implements IContainer<E>
{
public Container()
{
+ this(false);
+ }
+
+ /**
+ * @since 3.3
+ */
+ public Container(boolean shareable)
+ {
+ super(shareable);
}
public boolean isEmpty()
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/lifecycle/Lifecycle.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/lifecycle/Lifecycle.java
index 9d86ee9810..a63628d87d 100644
--- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/lifecycle/Lifecycle.java
+++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/lifecycle/Lifecycle.java
@@ -51,7 +51,7 @@ public class Lifecycle extends Notifier implements ILifecycle, DeferrableActivat
{
}
- public final void activate() throws LifecycleException
+ void internalActivate() throws LifecycleException
{
try
{
@@ -105,7 +105,7 @@ public class Lifecycle extends Notifier implements ILifecycle, DeferrableActivat
}
}
- public final Exception deactivate()
+ Exception internalDeactivate()
{
try
{
@@ -157,6 +157,16 @@ public class Lifecycle extends Notifier implements ILifecycle, DeferrableActivat
}
}
+ public final void activate() throws LifecycleException
+ {
+ internalActivate();
+ }
+
+ public final Exception deactivate()
+ {
+ return internalDeactivate();
+ }
+
/**
* @since 3.0
*/
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/lifecycle/ShareableLifecycle.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/lifecycle/ShareableLifecycle.java
new file mode 100644
index 0000000000..674d6df219
--- /dev/null
+++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/lifecycle/ShareableLifecycle.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) 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
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.net4j.util.lifecycle;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * A {@link Lifecycle lifecycle} entity with a reference count that can be {@link #activate() activated} multiple times.
+ *
+ * @author Eike Stepper
+ * @since 3.3
+ */
+public class ShareableLifecycle extends Lifecycle
+{
+ private AtomicInteger refCount;
+
+ public ShareableLifecycle()
+ {
+ this(true);
+ }
+
+ public ShareableLifecycle(boolean shared)
+ {
+ if (shared)
+ {
+ refCount = new AtomicInteger();
+ }
+ }
+
+ @Override
+ void internalActivate() throws LifecycleException
+ {
+ if (refCount == null || refCount.getAndIncrement() == 0)
+ {
+ super.internalActivate();
+ }
+ }
+
+ @Override
+ Exception internalDeactivate()
+ {
+ if (refCount == null || refCount.decrementAndGet() == 0)
+ {
+ return super.internalDeactivate();
+ }
+
+ return null;
+ }
+}

Back to the top