Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2006-10-22 20:28:22 +0000
committerEike Stepper2006-10-22 20:28:22 +0000
commit697d6277d2715b06e41abc790ab8b053df1520c7 (patch)
tree42cf443c1076c70add0e3e10a4658097f4bff574 /plugins/org.eclipse.net4j/src/org/eclipse/net4j/util
parentd2b31d4e130e492fe6a7581612a85d35659ef4b3 (diff)
downloadcdo-697d6277d2715b06e41abc790ab8b053df1520c7.tar.gz
cdo-697d6277d2715b06e41abc790ab8b053df1520c7.tar.xz
cdo-697d6277d2715b06e41abc790ab8b053df1520c7.zip
Signal protocol
Diffstat (limited to 'plugins/org.eclipse.net4j/src/org/eclipse/net4j/util')
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/AsynchronousWorkSerializer.java127
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/SynchronousWorkSerializer.java (renamed from plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/Asynchronizer.java)15
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/WorkSerializer.java (renamed from plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/Worker.java)10
3 files changed, 143 insertions, 9 deletions
diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/AsynchronousWorkSerializer.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/AsynchronousWorkSerializer.java
new file mode 100644
index 0000000000..479b58a64a
--- /dev/null
+++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/AsynchronousWorkSerializer.java
@@ -0,0 +1,127 @@
+/***************************************************************************
+ * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany.
+ * 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.concurrent;
+
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ExecutorService;
+
+/**
+ * @author Eike Stepper
+ */
+public class AsynchronousWorkSerializer implements WorkSerializer, Runnable
+{
+ private ExecutorService executorService;
+
+ private Queue<Runnable> workQueue;
+
+ private Occupation occupation = new Occupation();
+
+ public AsynchronousWorkSerializer(ExecutorService executorService, Queue<Runnable> workQueue)
+ {
+ if (executorService == null)
+ {
+ throw new IllegalArgumentException("executorService == null");
+ }
+
+ this.executorService = executorService;
+ this.workQueue = workQueue;
+ }
+
+ public AsynchronousWorkSerializer(ExecutorService executorService)
+ {
+ this(executorService, new ConcurrentLinkedQueue());
+ }
+
+ public ExecutorService getExecutorService()
+ {
+ return executorService;
+ }
+
+ public void addWork(Runnable work)
+ {
+ workQueue.add(work);
+
+ // isOccupied can (and must) be called unsynchronized here
+ if (!occupation.isOccupied())
+ {
+ synchronized (occupation)
+ {
+ occupation.setOccupied(true);
+ }
+
+ System.out.println(toString() + ": Notifying executor service");
+ executorService.execute(this);
+ }
+ }
+
+ /**
+ * Executed in the context of the
+ * {@link #getExecutorService() executor service}.
+ * <p>
+ */
+ public void run()
+ {
+ synchronized (occupation)
+ {
+ Runnable work;
+ while (occupation.isOccupied() && (work = workQueue.poll()) != null)
+ {
+ try
+ {
+ work.run();
+ }
+ catch (RuntimeException ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ occupation.setOccupied(false);
+ }
+ }
+
+ public void dispose()
+ {
+ if (occupation.isOccupied())
+ {
+ occupation.setOccupied(false);
+ }
+
+ workQueue.clear();
+ workQueue = null;
+ executorService = null;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "AsynchronousWorkSerializer[" + executorService + "]";
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private static class Occupation
+ {
+ private boolean occupied = false;
+
+ public boolean isOccupied()
+ {
+ return occupied;
+ }
+
+ public void setOccupied(boolean occupied)
+ {
+ this.occupied = occupied;
+ }
+ }
+}
diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/Asynchronizer.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/SynchronousWorkSerializer.java
index 60840f0777..d727aaf974 100644
--- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/Asynchronizer.java
+++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/SynchronousWorkSerializer.java
@@ -13,13 +13,24 @@ package org.eclipse.net4j.util.concurrent;
/**
* @author Eike Stepper
*/
-public class Asynchronizer
+public class SynchronousWorkSerializer implements WorkSerializer
{
- public Asynchronizer()
+ public SynchronousWorkSerializer()
{
}
public void addWork(Runnable work)
{
+ work.run();
+ }
+
+ public void dispose()
+ {
+ }
+
+ @Override
+ public String toString()
+ {
+ return "SynchronousWorkSerializer";
}
}
diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/Worker.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/WorkSerializer.java
index 0a1d268b18..4539855c14 100644
--- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/Worker.java
+++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/concurrent/WorkSerializer.java
@@ -13,13 +13,9 @@ package org.eclipse.net4j.util.concurrent;
/**
* @author Eike Stepper
*/
-public class Worker
+public interface WorkSerializer
{
- public Worker()
- {
- }
+ public void addWork(Runnable work);
- public void addWork(Runnable work)
- {
- }
+ public void dispose();
}

Back to the top