Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.equinox.util/src/org/eclipse/equinox/internal/util/event/EventThread.java')
-rw-r--r--bundles/org.eclipse.equinox.util/src/org/eclipse/equinox/internal/util/event/EventThread.java310
1 files changed, 0 insertions, 310 deletions
diff --git a/bundles/org.eclipse.equinox.util/src/org/eclipse/equinox/internal/util/event/EventThread.java b/bundles/org.eclipse.equinox.util/src/org/eclipse/equinox/internal/util/event/EventThread.java
deleted file mode 100644
index 34b638608..000000000
--- a/bundles/org.eclipse.equinox.util/src/org/eclipse/equinox/internal/util/event/EventThread.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 1997-2007 by ProSyst Software GmbH
- * http://www.prosyst.com
- * 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:
- * ProSyst Software GmbH - initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.internal.util.event;
-
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import org.eclipse.equinox.internal.util.UtilActivator;
-
-/**
- * Abstract class for asynchronous event dispatching
- *
- * @author Pavlin Dobrev
- * @version 1.0
- */
-
-public abstract class EventThread implements Runnable {
-
- /**
- * The last callbacked listener. If the events thread is not responding,
- * subclasses can take the appropriate actions - remove the listener for
- * example
- */
- public Object bad;
-
- /**
- * The event queue. This object must be used for synchronization with the
- * events thread's state
- */
- protected Queue queue;
-
- /**
- * The state of the thread.
- * <li> bit 0: 0 = started / 1 = stopped;
- * <li> bit 1: 0 not waiting / 1 = waiting
- */
- protected int state;
-
- /**
- * The time spent in the current callback, or 0 if the thread is not in a
- * callback
- */
- protected long time = 0;
- /**
- * Instancies counter. Subclasses must not modify it.
- */
- protected int counter = 1;
-
- /**
- * The event to be dispatched
- */
- protected Object element;
- protected String baseName;
- protected String name;
- protected Thread thread;
- protected ThreadGroup group;
- private static PrivilegedActionImpl privilegedAction = null;
-
- /**
- * Constructs the first instance of the EventThread
- *
- * @param group
- * The ThreadGroup of the thread, or null for the current thread
- * group
- * @param name
- * The base name of the thread. The <code> counter </code> value
- * will be added at the end of the string to construct the full
- * name.
- * @param size
- * The initial number of elements of the events queue
- */
- public EventThread(ThreadGroup group, String name, int size) {
- makeThread(this.group = group, this.name = name + '0');
- baseName = name;
- queue = new Queue(size);
- int priority = getThreadPriority();
- if (priority != Thread.NORM_PRIORITY)
- thread.setPriority(priority);
- }
-
- /**
- * Constructs the first instance of the EventThread
- *
- * @param group
- * The ThreadGroup of the thread, or null for the current thread
- * group
- * @param name
- * The base name of the thread. The <code> counter </code> value
- * will be added at the end of the string to construct the full
- * name.
- * @param queue
- * The events queue
- */
- public EventThread(ThreadGroup group, String name, Queue queue) {
- makeThread(this.group = group, this.name = name + '0');
- baseName = name;
- this.queue = queue;
- int priority = getThreadPriority();
- if (priority != Thread.NORM_PRIORITY)
- thread.setPriority(priority);
- }
-
- /**
- * Constructs a new EventThread, after the <code> old </code> event thread
- * has stopped responding
- *
- * @param old
- * The previous instance
- */
- protected EventThread(EventThread old) {
- makeThread(group = old.thread.getThreadGroup(), name = old.baseName + old.counter++);
- baseName = old.baseName;
- counter = old.counter;
- queue = old.queue;
- int priority = getThreadPriority();
- if (priority != Thread.NORM_PRIORITY)
- thread.setPriority(priority);
- }
-
- public void start() {
- thread.start();
- }
-
- /**
- * Adds an event in the event queue. The method must be synchronized
- * outside, on the <code> queue </code> field.
- *
- * @param event
- * The event to add
- * @param check
- * If true, the method will check if the EventThread is still
- * responding
- */
- public void addEvent(Object event, boolean check) {
- try {
- queue.put(event);
- } catch (Throwable t) {
- print(t);
- return;
- }
- if ((state & 2) != 0)
- queue.notify();
- else if (check && checkTime())
- try {
- state |= 1;
- newEventDispatcher(); // must call start
- } catch (Throwable t) {
- print(t);
- state &= 254;
- }
- }
-
- /**
- * Processes the event queue. Sets the event to be dispathed in the
- * <code> element </code> field and calls <cope> processEvent </code>
- */
- public void run() {
- synchronized (queue) {
- queue.notifyAll();
- }
- while (true) {
- try {
- synchronized (queue) {
- if ((state & 1) != 0)
- return; // closed
- while ((element = queue.get()) == null)
- try {
- state |= 2; // waiting
- queue.wait();
- if ((state & 1) != 0)
- return; // closed
- state &= 253; // not waiting
- } catch (InterruptedException ie) {
- }
- }
- processEvent();
-
- } catch (Throwable t) {
- print(t);
- try { // fix memory leak
- throw new Exception();
- } catch (Exception _) {
- }
- }
- }
- }
-
- private void makeThread(ThreadGroup group, String name) {
- try {
- if (privilegedAction == null) {
- privilegedAction = new PrivilegedActionImpl();
- }
- privilegedAction.set(group, this, name);
- thread = (Thread) AccessController.doPrivileged(privilegedAction);
- // thread = new Thread(group, this, name);
- // thread.setDaemon(false);
- // if (!disableContextClassLoader)
- // thread.setContextClassLoader(null);
- } catch (RuntimeException re) {
- throw re;
- } catch (Exception exc) {
- throw new RuntimeException(exc.toString());
- }
- }
-
- public Thread getThread() {
- return thread;
- }
-
- public String getName() {
- return name;
- }
-
- /**
- * Returns the desired thread priority. Called in the constructors of the
- * class in order to set the returned value to the thread.
- *
- * @return
- */
- public abstract int getThreadPriority();
-
- /**
- * Performs the actual event delivery. The event is stored in the
- * <code> element </code> field. The method is supposed to perform the
- * following for every listener:
- * <li> synchronized on <code> queue </code> check the state of the thread -
- * if it si closed - return
- * <li> set the fields <code> bad and time <code>
- * <li> callback
- * <li> set bad to null and time to 0
- */
- public abstract void processEvent();
-
- /**
- * Checks if the thread is still active. The fields <code> time </code> and
- * <code> bad </code> must be used. The method is called from the addEvent
- * method - thus should be synchronizes on the <code> queue </code> field
- * outside and additional synchronization is not needed.
- */
- public abstract boolean checkTime();
-
- /**
- * The method must create a new EventThread instance, using
- * <code> super.EventThread(this) </code> and start it.
- */
- public abstract void newEventDispatcher();
-
- /**
- * Logs the error.
- *
- * @param t
- */
- public abstract void print(Throwable t);
-}
-
-class PrivilegedActionImpl implements PrivilegedAction {
- private ThreadGroup group;
- private Runnable runnable;
- private String name;
-
- private boolean locked = false;
- private int waiting = 0;
-
- void set(ThreadGroup group, Runnable runnable, String name) {
- lock();
- this.group = group;
- this.runnable = runnable;
- this.name = name;
- }
-
- public Object run() {
- ThreadGroup group = this.group;
- Runnable runnable = this.runnable;
- String name = this.name;
- unlock();
- Thread th = new Thread(group, runnable, name);
- if (!UtilActivator.getBoolean("equinox.disableContextClassLoader"))
- th.setContextClassLoader(null);
- th.setDaemon(false);
- return th;
- }
-
- private synchronized void lock() {
- while (locked)
- try {
- waiting++;
- wait();
- waiting--;
- } catch (Exception exc) {
- }
- locked = true;
- }
-
- private synchronized void unlock() {
- locked = false;
- group = null;
- runnable = null;
- name = null;
- if (waiting > 0)
- notifyAll();
- }
-}

Back to the top