mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
[302628] Moved to a non-API package.
This commit is contained in:
parent
845bf5a063
commit
79c61294f9
1 changed files with 0 additions and 200 deletions
|
@ -1,200 +0,0 @@
|
||||||
package org.eclipse.cdt.dsf.concurrent;
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2008 Wind River Systems, Inc. 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:
|
|
||||||
* Wind River Systems - initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.Executor;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.dsf.internal.DsfPlugin;
|
|
||||||
import org.eclipse.core.runtime.IStatus;
|
|
||||||
import org.eclipse.core.runtime.Status;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A general purpose cache, which caches the result of a single request.
|
|
||||||
* Sub classes need to implement {@link #retrieve(DataRequestMonitor)} to fetch
|
|
||||||
* data from the data source. Clients are responsible for calling
|
|
||||||
* {@link #disable()} and {@link #reset()} to manage the state of the cache in
|
|
||||||
* response to events from the data source.
|
|
||||||
* <p>
|
|
||||||
* This cache requires an executor to use. The executor is used to synchronize
|
|
||||||
* access to the cache state and data.
|
|
||||||
* </p>
|
|
||||||
* @since 2.1
|
|
||||||
*/
|
|
||||||
@ConfinedToDsfExecutor("fExecutor")
|
|
||||||
public abstract class DataCache<V> {
|
|
||||||
|
|
||||||
final private Executor fExecutor;
|
|
||||||
|
|
||||||
private boolean fValid;
|
|
||||||
|
|
||||||
protected DataRequestMonitor<V> fRm;
|
|
||||||
private V fData;
|
|
||||||
private IStatus fStatus;
|
|
||||||
|
|
||||||
private List<DataRequestMonitor<V>> fWaitingList = new LinkedList<DataRequestMonitor<V>>();
|
|
||||||
|
|
||||||
public DataCache(Executor executor) {
|
|
||||||
fExecutor = executor;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sub-classes should override this method to retrieve the cache data
|
|
||||||
* from its source.
|
|
||||||
*
|
|
||||||
* @param rm Request monitor for completion of data retrieval.
|
|
||||||
*/
|
|
||||||
protected abstract void retrieve(DataRequestMonitor<V> rm);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns <code>true</code> if the cache is currently valid. I.e.
|
|
||||||
* whether the cache can return a value immediately without first
|
|
||||||
* retrieving it from the data source.
|
|
||||||
*/
|
|
||||||
public boolean isValid() {
|
|
||||||
return fValid;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns <code>true</code> if the cache is currently waiting for data
|
|
||||||
* from the data source.
|
|
||||||
*/
|
|
||||||
public boolean isPending() {
|
|
||||||
return fRm != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the current data value held by this cache. Clients should first
|
|
||||||
* call isValid() to determine if the data is up to date.
|
|
||||||
*/
|
|
||||||
public V getData() {
|
|
||||||
return fData;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the status of the source request held by this cache. Clients
|
|
||||||
* should first call isValid() to determine if the data is up to date.
|
|
||||||
*/
|
|
||||||
public IStatus getStatus() {
|
|
||||||
return fStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Request data from the cache. The cache is valid, it will complete the
|
|
||||||
* request immediately, otherwise data will first be retrieved from the
|
|
||||||
* source.
|
|
||||||
* @param req
|
|
||||||
*/
|
|
||||||
public void request(final DataRequestMonitor<V> rm) {
|
|
||||||
if (!fValid) {
|
|
||||||
boolean first = fWaitingList.isEmpty();
|
|
||||||
fWaitingList.add(rm);
|
|
||||||
if(first) {
|
|
||||||
fRm = new DataRequestMonitor<V>(fExecutor, null) {
|
|
||||||
@Override
|
|
||||||
protected void handleCompleted() {
|
|
||||||
if (!isCanceled()) {
|
|
||||||
fValid = true;
|
|
||||||
fRm = null;
|
|
||||||
set(getData(), getStatus());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
retrieve(fRm);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
rm.setData(fData);
|
|
||||||
rm.setStatus(fStatus);
|
|
||||||
rm.done();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void set(V data, IStatus status) {
|
|
||||||
fData = data;
|
|
||||||
fStatus = status;
|
|
||||||
List<DataRequestMonitor<V>> waitingList = fWaitingList;
|
|
||||||
fWaitingList = new LinkedList<DataRequestMonitor<V>>();
|
|
||||||
|
|
||||||
for (DataRequestMonitor<V> rm : waitingList) {
|
|
||||||
rm.setData(data);
|
|
||||||
rm.setStatus(status);
|
|
||||||
rm.done();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resets the cache with a data value <code>null</code> and an error
|
|
||||||
* status with code {@link IDsfStatusConstants#INVALID_STATE}.
|
|
||||||
*
|
|
||||||
* @see #reset(Object, IStatus)
|
|
||||||
*/
|
|
||||||
public void reset() {
|
|
||||||
reset(null, new Status(IStatus.ERROR, DsfPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Cache reset", null)); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resets the cache with given data and status. Resetting the cache
|
|
||||||
* forces the cache to be invalid and cancels any current pending requests
|
|
||||||
* from data source.
|
|
||||||
* <p>
|
|
||||||
* This method should be called when the data source has issued an event
|
|
||||||
* indicating that the source data has changed but data may still be
|
|
||||||
* retrieved. Clients may need to re-request data following cache reset.
|
|
||||||
* </p>
|
|
||||||
* @param data The data that should be returned to any clients currently
|
|
||||||
* waiting for cache data.
|
|
||||||
* @status The status that should be returned to any clients currently
|
|
||||||
* waiting for cache data.
|
|
||||||
*/
|
|
||||||
public void reset(V data, IStatus status) {
|
|
||||||
fValid = false;
|
|
||||||
if (fRm != null) {
|
|
||||||
fRm.cancel();
|
|
||||||
fRm = null;
|
|
||||||
}
|
|
||||||
set(data, status);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disables the cache with a data value <code>null</code> and an error
|
|
||||||
* status with code {@link IDsfStatusConstants#INVALID_STATE}.
|
|
||||||
*
|
|
||||||
* @see #disable(Object, IStatus)
|
|
||||||
*/
|
|
||||||
public void disable() {
|
|
||||||
disable(null, new Status(IStatus.ERROR, DsfPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Cache disable", null)); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resets the cache then disables it. When a cache is disabled it means
|
|
||||||
* that it is valid and requests to the data source will not be sent.
|
|
||||||
* <p>
|
|
||||||
* This method should be called when the data source has issued an event
|
|
||||||
* indicating that the source data has changed and future requests for
|
|
||||||
* data will return the given data and status. Once the source data
|
|
||||||
* becomes available again, clients should call {@link #reset()}.
|
|
||||||
* </p>
|
|
||||||
* @param data The data that should be returned to any clients waiting for
|
|
||||||
* cache data and for clients requesting data until the cache is reset again.
|
|
||||||
* @status The status that should be returned to any clients waiting for
|
|
||||||
* cache data and for clients requesting data until the cache is reset again.
|
|
||||||
*
|
|
||||||
* @see #reset(Object, IStatus)
|
|
||||||
*/
|
|
||||||
public void disable(V data, IStatus status) {
|
|
||||||
reset(data, status);
|
|
||||||
fValid = true;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Add table
Reference in a new issue