/******************************************************************************* * Copyright (c) 2000, 2011 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.swt.internal; /** * Instances of this represent a recursive monitor. */ public class Lock { int count, waitCount; Thread owner; /** * Locks the monitor and returns the lock count. If * the lock is owned by another thread, wait until * the lock is released. * * @return the lock count */ public int lock() { synchronized (this) { Thread current = Thread.currentThread(); if (owner != current) { waitCount++; while (count > 0) { try { wait(); } catch (InterruptedException e) { /* Wait forever, just like synchronized blocks */ } } --waitCount; owner = current; } return ++count; } } /** * Unlocks the monitor. If the current thread is not * the monitor owner, do nothing. */ public void unlock() { synchronized (this) { Thread current = Thread.currentThread(); if (owner == current) { if (--count == 0) { owner = null; if (waitCount > 0) notifyAll(); } } } } }