Mercurial > projects > dwt2
diff org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/ILock.d @ 12:bc29606a740c
Added dwt-addons in original directory structure of eclipse.org
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sat, 14 Mar 2009 18:23:29 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/ILock.d Sat Mar 14 18:23:29 2009 +0100 @@ -0,0 +1,107 @@ +/******************************************************************************* + * Copyright (c) 2003, 2008 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 - Initial API and implementation + * Port to the D programming language: + * Frank Benoit <benoit@tionex.de> + *******************************************************************************/ +module org.eclipse.core.runtime.jobs.ILock; + +import java.lang.all; + +/** + * A lock is used to control access to an exclusive resource. + * <p> + * Locks are reentrant. That is, they can be acquired multiple times by the same thread + * without releasing. Locks are only released when the number of successful acquires + * equals the number of successful releases. + * </p><p> + * Locks are capable of detecting and recovering from programming errors that cause + * circular waiting deadlocks. When a deadlock between two or more <tt>ILock</tt> + * instances is detected, detailed debugging information is printed to the log file. The + * locks will then automatically recover from the deadlock by employing a release + * and wait strategy. One thread will lose control of the locks it owns, thus breaking + * the deadlock and allowing other threads to proceed. Once that thread's locks are + * all available, it will be given exclusive access to all its locks and allowed to proceed. + * A thread can only lose locks while it is waiting on an <tt>acquire()</tt> call. + * + * </p><p> + * Successive acquire attempts by different threads are queued and serviced on + * a first come, first served basis. + * </p><p> + * It is very important that acquired locks eventually get released. Calls to release + * should be done in a finally block to ensure they execute. For example: + * <pre> + * try { + * lock.acquire(); + * // ... do work here ... + * } finally { + * lock.release(); + * } + * </pre> + * Note: although <tt>lock.acquire</tt> should never fail, it is good practice to place + * it inside the try block anyway. Releasing without acquiring is far less catastrophic + * than acquiring without releasing. + * </p> + * + * @see IJobManager#newLock() + * @since 3.0 + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface ILock { + /** + * Attempts to acquire this lock. If the lock is in use and the specified delay is + * greater than zero, the calling thread will block until one of the following happens: + * <ul> + * <li>This lock is available</li> + * <li>The thread is interrupted</li> + * <li>The specified delay has elapsed</li> + * </ul> + * <p> + * While a thread is waiting, locks it already owns may be granted to other threads + * if necessary to break a deadlock. In this situation, the calling thread may be blocked + * for longer than the specified delay. On returning from this call, the calling thread + * will once again have exclusive access to any other locks it owned upon entering + * the acquire method. + * + * @param delay the number of milliseconds to delay + * @return <code>true</code> if the lock was successfully acquired, and + * <code>false</code> otherwise. + * @exception InterruptedException if the thread was interrupted + */ + public bool acquire(long delay); + + /** + * Acquires this lock. If the lock is in use, the calling thread will block until the lock + * becomes available. If the calling thread owns several locks, it will be blocked + * until all threads it requires become available, or until the thread is interrupted. + * While a thread is waiting, its locks may be granted to other threads if necessary + * to break a deadlock. On returning from this call, the calling thread will + * have exclusive access to this lock, and any other locks it owned upon + * entering the acquire method. + * <p> + * This implementation ignores attempts to interrupt the thread. If response to + * interruption is needed, use the method <code>acquire(long)</code> + */ + public void acquire(); + + /** + * Returns the number of nested acquires on this lock that have not been released. + * This is the number of times that release() must be called before the lock is + * freed. + * + * @return the number of nested acquires that have not been released + */ + public int getDepth(); + + /** + * Releases this lock. Locks must only be released by the thread that currently + * owns the lock. + */ + public void release(); +}