summaryrefslogtreecommitdiffstats
path: root/awt/org/apache/harmony/awt/wtk/Synchronizer.java
diff options
context:
space:
mode:
Diffstat (limited to 'awt/org/apache/harmony/awt/wtk/Synchronizer.java')
-rw-r--r--awt/org/apache/harmony/awt/wtk/Synchronizer.java200
1 files changed, 0 insertions, 200 deletions
diff --git a/awt/org/apache/harmony/awt/wtk/Synchronizer.java b/awt/org/apache/harmony/awt/wtk/Synchronizer.java
deleted file mode 100644
index 3eeaa0b..0000000
--- a/awt/org/apache/harmony/awt/wtk/Synchronizer.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * @author Mikhail Danilov
- * @version $Revision$
- */
-package org.apache.harmony.awt.wtk;
-
-import java.util.Hashtable;
-import java.util.LinkedList;
-
-import org.apache.harmony.awt.internal.nls.Messages;
-
-/**
- * Class synchronizer is to protect AWT state integrity in multithreading environment.
- * It is supposed to have a child class per native platform.
- * The only instance is created on the first use of one of the core AWT classes.
- * Registers WTK on the dispatch thread startup.
- * It is just a special kind of mutex.
- *
- */
-
-public class Synchronizer {
- //TODO: think about java.util.concurrent use for faster blocking/awaking operations
- //TODO: think about all synchronized methods. Is there need to synchronize everything?
-
- /**
- * This field holds the counter of lock operation.
- * To free synchronizer unlock method must be called $acquestCounter times.
- * Equals to 0 when synchronizer is free.
- */
- protected int acquestCounter;
-
- /**
- * This field holds the owner of synchronizer.
- * Owner of synchronizer is a last thread that successfully locked synchronizer and
- * still havn't freed it. Equals to null when synchronizer is free.
- */
- protected Thread owner;
-
- /**
- * This field holds the wait queue.
- * Wait queue is a queue where thread wait for synchronizer access.
- * Empty when synchronizer is free.
- */
- protected final LinkedList<Thread> waitQueue = new LinkedList<Thread>();
-
- /**
- * The event dispatch thread
- */
- protected Thread dispatchThread;
-
- private final Hashtable<Thread, Integer> storedStates = new Hashtable<Thread, Integer>();
-
- /**
- * Acquire the lock for this synchronizer. Nested lock is supported.
- * If the mutex is already locked by another thread, the current thread will be put
- * into wait queue until the lock becomes available.
- * All user threads are served in FIFO order. Dispatch thread has higher priority.
- * Supposed to be used in Toolkit.lockAWT() only.
- */
- public void lock() {
- synchronized (this) {
- Thread curThread = Thread.currentThread();
-
- if (acquestCounter == 0) {
- acquestCounter = 1;
- owner = curThread;
- } else {
- if (owner == curThread) {
- acquestCounter++;
- } else {
- if (curThread == dispatchThread) {
- waitQueue.addFirst(curThread);
- } else {
- waitQueue.addLast(curThread);
- }
- try {
- wait();
- } catch (InterruptedException e) {
- if (owner != curThread) {
- waitQueue.remove(curThread);
- // awt.1F=Waiting for resource access thread interrupted not from unlock method.
- throw new RuntimeException(Messages
- .getString("awt.1F")); //$NON-NLS-1$
- }
- }
- }
- }
- }
- }
-
- /**
- * Release the lock for this synchronizer.
- * If wait queue is not empty the first waiting thread acquires the lock.
- * Supposed to be used in Toolkit.unlockAWT() only.
- */
- public void unlock() {
- synchronized (this) {
- if (acquestCounter == 0) {
- // awt.20=Can't unlock not locked resource.
- throw new RuntimeException(Messages.getString("awt.20")); //$NON-NLS-1$
- }
- if (owner != Thread.currentThread()) {
- // awt.21=Not owner can't unlock resource.
- throw new RuntimeException(Messages.getString("awt.21")); //$NON-NLS-1$
- }
-
- acquestCounter--;
- if (acquestCounter == 0) {
- if (waitQueue.size() > 0) {
- acquestCounter = 1;
- owner = waitQueue.removeFirst();
- owner.interrupt();
- } else {
- owner = null;
- }
- }
- }
- }
-
- /**
- * Stores state of this synchronizer and frees it.
- * Supposed to be used in Toolkit.unsafeInvokeAndWaitUnderAWTLock() only in pair with
- * lockAndRestoreState().
- * Do not call it directly.
- */
- public void storeStateAndFree() {
- synchronized (this) {
- Thread curThread = Thread.currentThread();
-
- if (owner != curThread) {
- // awt.22=Not owner can't free resource.
- throw new RuntimeException(Messages.getString("awt.22")); //$NON-NLS-1$
- }
- if (storedStates.containsKey(curThread)) {
- // awt.23=One thread can't store state several times in a row.
- throw new RuntimeException(Messages.getString("awt.23")); //$NON-NLS-1$
- }
-
- storedStates.put(curThread, new Integer(acquestCounter));
- acquestCounter = 1;
- unlock();
- }
- }
-
- /**
- * Locks this synchronizer and restores it's state.
- * Supposed to be used in Toolkit.unsafeInvokeAndWaitUnderAWTLock() only in pair with
- * storeStateAndFree().
- * Do not call it directly.
- */
- public void lockAndRestoreState() {
- synchronized (this) {
- Thread curThread = Thread.currentThread();
-
- if (owner == curThread) {
- // awt.24=Owner can't overwrite resource state. Lock operations may be lost.
- throw new RuntimeException(
- Messages.getString("awt.24")); //$NON-NLS-1$
- }
- if (!storedStates.containsKey(curThread)) {
- // awt.25=No state stored for current thread.
- throw new RuntimeException(Messages.getString("awt.25")); //$NON-NLS-1$
- }
-
- lock();
- acquestCounter = storedStates.get(curThread).intValue();
- storedStates.remove(curThread);
- }
- }
-
- /**
- * Sets references to WTK and event dispatch thread.
- * Called on toolkit startup.
- *
- * @param wtk - reference to WTK instance
- * @param dispatchThread - reference to event dispatch thread
- */
- public void setEnvironment(WTK wtk, Thread dispatchThread) {
- synchronized (this) {
- this.dispatchThread = dispatchThread;
- }
- }
-
-}