From eb75c9f24dd593621ff9652b94ba37e794e7f52f Mon Sep 17 00:00:00 2001 From: Eike Stepper Date: Thu, 30 Aug 2007 07:50:37 +0000 Subject: [201366] Random deadlocks https://bugs.eclipse.org/bugs/show_bug.cgi?id=201366 --- .../concurrent/AsynchronousWorkSerializer.java | 6 ++-- .../util/concurrent/CompletionWorkSerializer.java | 9 +++++- .../util/concurrent/QueueWorkerWorkSerializer.java | 37 ++++++++++++++++++++++ .../util/concurrent/SynchronousWorkSerializer.java | 5 +-- .../net4j/util/concurrent/IWorkSerializer.java | 5 +-- .../src/org/eclipse/internal/net4j/Channel.java | 9 ++++-- 6 files changed, 59 insertions(+), 12 deletions(-) create mode 100644 plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/concurrent/QueueWorkerWorkSerializer.java diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/concurrent/AsynchronousWorkSerializer.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/concurrent/AsynchronousWorkSerializer.java index c7d940379e..3b177cfeb1 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/concurrent/AsynchronousWorkSerializer.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/concurrent/AsynchronousWorkSerializer.java @@ -54,7 +54,7 @@ public class AsynchronousWorkSerializer implements IWorkSerializer, Runnable return executorService; } - public void addWork(Runnable work) + public boolean addWork(Runnable work) { // Need to be a block of execution. Cannot add when doing last check // XXX synchronized (newElementLock) @@ -77,6 +77,8 @@ public class AsynchronousWorkSerializer implements IWorkSerializer, Runnable executorService.execute(this); } } + + return true; } /** @@ -145,7 +147,7 @@ public class AsynchronousWorkSerializer implements IWorkSerializer, Runnable @Override public String toString() { - return "AsynchronousWorkSerializer[" + executorService + "]"; //$NON-NLS-1$ //$NON-NLS-2$ + return AsynchronousWorkSerializer.class.getSimpleName(); } /** diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/concurrent/CompletionWorkSerializer.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/concurrent/CompletionWorkSerializer.java index 4e71f3882e..b499b34911 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/concurrent/CompletionWorkSerializer.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/concurrent/CompletionWorkSerializer.java @@ -53,8 +53,15 @@ public class CompletionWorkSerializer implements IWorkSerializer { } - public void addWork(Runnable work) + public boolean addWork(Runnable work) { completionService.submit(work, true); + return true; + } + + @Override + public String toString() + { + return CompletionWorkSerializer.class.getSimpleName(); } } diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/concurrent/QueueWorkerWorkSerializer.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/concurrent/QueueWorkerWorkSerializer.java new file mode 100644 index 0000000000..91c3842b85 --- /dev/null +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/concurrent/QueueWorkerWorkSerializer.java @@ -0,0 +1,37 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2007 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.internal.util.concurrent; + +import org.eclipse.net4j.internal.util.lifecycle.QueueWorker; +import org.eclipse.net4j.util.concurrent.IWorkSerializer; +import org.eclipse.net4j.util.lifecycle.LifecycleUtil; + +/** + * @author Eike Stepper + */ +public class QueueWorkerWorkSerializer extends QueueWorker implements IWorkSerializer +{ + public QueueWorkerWorkSerializer() + { + LifecycleUtil.activate(this); + } + + public void dispose() + { + deactivate(); + } + + @Override + protected void work(WorkContext context, Runnable element) + { + element.run(); + } +} diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/concurrent/SynchronousWorkSerializer.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/concurrent/SynchronousWorkSerializer.java index 99ebcf5c82..0d13c2aa26 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/concurrent/SynchronousWorkSerializer.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/concurrent/SynchronousWorkSerializer.java @@ -21,9 +21,10 @@ public class SynchronousWorkSerializer implements IWorkSerializer { } - public void addWork(Runnable work) + public boolean addWork(Runnable work) { work.run(); + return true; } public void dispose() @@ -33,6 +34,6 @@ public class SynchronousWorkSerializer implements IWorkSerializer @Override public String toString() { - return "SynchronousWorkSerializer"; //$NON-NLS-1$ + return SynchronousWorkSerializer.class.getSimpleName(); } } diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/IWorkSerializer.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/IWorkSerializer.java index 4cbeff2b8f..ad0d83548e 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/IWorkSerializer.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/concurrent/IWorkSerializer.java @@ -10,16 +10,13 @@ **************************************************************************/ package org.eclipse.net4j.util.concurrent; -import java.util.concurrent.ExecutorCompletionService; /** - * TODO Replace by {@link ExecutorCompletionService}? - * * @author Eike Stepper */ public interface IWorkSerializer { - public void addWork(Runnable work); + public boolean addWork(Runnable work); public void dispose(); } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/Channel.java b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/Channel.java index 9e49cbaf03..21c13ea3db 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/Channel.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/internal/net4j/Channel.java @@ -17,7 +17,7 @@ import org.eclipse.net4j.IBufferProvider; import org.eclipse.net4j.IChannel; import org.eclipse.net4j.IChannelID; import org.eclipse.net4j.IConnector; -import org.eclipse.net4j.internal.util.concurrent.CompletionWorkSerializer; +import org.eclipse.net4j.internal.util.concurrent.AsynchronousWorkSerializer; import org.eclipse.net4j.internal.util.concurrent.SynchronousWorkSerializer; import org.eclipse.net4j.internal.util.lifecycle.Lifecycle; import org.eclipse.net4j.internal.util.om.trace.ContextTracer; @@ -184,6 +184,7 @@ public class Channel extends Lifecycle implements IChannel, IBufferProvider } else { + // Shutting down buffer.release(); } } @@ -220,8 +221,9 @@ public class Channel extends Lifecycle implements IChannel, IBufferProvider } else { - // receiveSerializer = new AsynchronousWorkSerializer(receiveExecutor); - receiveSerializer = new CompletionWorkSerializer(receiveExecutor); + receiveSerializer = new AsynchronousWorkSerializer(receiveExecutor); + // receiveSerializer = new CompletionWorkSerializer(); + // receiveSerializer = new QueueWorkerWorkSerializer(); } } @@ -314,6 +316,7 @@ public class Channel extends Lifecycle implements IChannel, IBufferProvider } else { + // Shutting down buffer.release(); } } -- cgit v1.2.3