Merge "Issue #2159 Synchronize TimeCache access in D2DTimeMatcher. Change-Id: I9116ced28775294385ea9ea92a1e63bf2fefff55" into development

Former-commit-id: b7ddbeed41 [formerly d4261fcc45] [formerly 6b93db235f [formerly c9dd4fe32a28f20a3d5883d767787f37598e435d]]
Former-commit-id: 6b93db235f
Former-commit-id: 8793ca3101
This commit is contained in:
Nate Jensen 2013-07-03 13:10:39 -05:00 committed by Gerrit Code Review
commit b688000175

View file

@ -72,7 +72,8 @@ import com.raytheon.uf.viz.d2d.core.D2DLoadProperties;
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 10, 2009 chammack Initial creation
* Feb 10, 2009 chammack Initial creation
* Jul 03, 2013 2159 bsteffen Synchronize TimeCache access.
*
* </pre>
*
@ -85,6 +86,10 @@ public class D2DTimeMatcher extends AbstractTimeMatcher {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(D2DTimeMatcher.class);
/**
* Always synchronize on an instance of TimeCache before using it to avoid
* getting mixed state from modification on other threads.
*/
private static class TimeCache {
/**
* The last set of times that the resource with these properties was
@ -99,6 +104,7 @@ public class D2DTimeMatcher extends AbstractTimeMatcher {
/** The number of frames time matched against */
private int lastFrameCount;
public DataTime[] getLastBaseTimes() {
return lastBaseTimes;
}
@ -121,6 +127,7 @@ public class D2DTimeMatcher extends AbstractTimeMatcher {
this.lastFrameTimes = frameTimes;
this.lastFrameCount = frameCount;
}
}
protected transient AbstractVizResource<?, ?> timeMatchBasis;
@ -177,9 +184,14 @@ public class D2DTimeMatcher extends AbstractTimeMatcher {
}
public void redoTimeMatching(AbstractVizResource<?, ?> resource) {
TimeCache cache = timeCacheMap.get(resource);
TimeCache cache = null;
synchronized (timeCacheMap) {
cache = timeCacheMap.get(resource);
}
if (cache != null) {
cache.setTimes(null, null);
synchronized (cache) {
cache.setTimes(null, null);
}
}
}
@ -352,22 +364,26 @@ public class D2DTimeMatcher extends AbstractTimeMatcher {
TimeMatchingConfiguration config = getConfiguration(rsc
.getLoadProperties());
TimeCache timeCache = getTimeCache(rsc);
DataTime[] timeSteps = getFrameTimes(descriptor, framesInfo);
if (Arrays.equals(timeSteps, timeCache.getLastBaseTimes())) {
framesInfo.getTimeMap().put(rsc, timeCache.getLastFrameTimes());
} else {
config = config.clone();
if (config.getDataTimes() == null
|| config.getDataTimes().length < 1) {
config.setDataTimes(getLatestTimes(rsc));
synchronized (timeCache) {
DataTime[] timeSteps = getFrameTimes(descriptor, framesInfo);
if (Arrays.equals(timeSteps, timeCache.getLastBaseTimes())) {
framesInfo.getTimeMap().put(rsc,
timeCache.getLastFrameTimes());
} else {
config = config.clone();
if (config.getDataTimes() == null
|| config.getDataTimes().length < 1) {
config.setDataTimes(getLatestTimes(rsc));
}
populateConfiguration(config);
DataTime[] overlayDates = TimeMatcher.makeOverlayList(
config.getDataTimes(), config.getClock(),
timeSteps, config.getLoadMode(),
config.getForecast(), config.getDelta(),
config.getTolerance());
timeCache.setTimes(timeSteps, overlayDates);
framesInfo.getTimeMap().put(rsc, overlayDates);
}
populateConfiguration(config);
DataTime[] overlayDates = TimeMatcher.makeOverlayList(
config.getDataTimes(), config.getClock(), timeSteps,
config.getLoadMode(), config.getForecast(),
config.getDelta(), config.getTolerance());
timeCache.setTimes(timeSteps, overlayDates);
framesInfo.getTimeMap().put(rsc, overlayDates);
}
}
}
@ -443,11 +459,14 @@ public class D2DTimeMatcher extends AbstractTimeMatcher {
int numberOfFrames) throws VizException {
if (timeMatchBasis != null) {
TimeCache timeCache = getTimeCache(timeMatchBasis);
DataTime[] times = timeCache.getLastFrameTimes();
if (times == null || timeCache.getLastBaseTimes() != null
|| timeCache.getLastFrameCount() != numberOfFrames) {
times = makeEmptyLoadList(numberOfFrames, timeMatchBasis);
timeCache.setTimes(null, times, numberOfFrames);
DataTime[] times = null;
synchronized (timeCache) {
times = timeCache.getLastFrameTimes();
if (times == null || timeCache.getLastBaseTimes() != null
|| timeCache.getLastFrameCount() != numberOfFrames) {
times = makeEmptyLoadList(numberOfFrames, timeMatchBasis);
timeCache.setTimes(null, times, numberOfFrames);
}
}
if (times != null) {
return times;
@ -479,7 +498,10 @@ public class D2DTimeMatcher extends AbstractTimeMatcher {
} else {
DataTime[] times = makeEmptyLoadList(numberOfFrames, rsc);
if (times != null) {
getTimeCache(rsc).setTimes(null, times, numberOfFrames);
TimeCache cache = getTimeCache(rsc);
synchronized(cache){
cache.setTimes(null, times, numberOfFrames);
}
return times;
}
}
@ -578,12 +600,14 @@ public class D2DTimeMatcher extends AbstractTimeMatcher {
}
private TimeCache getTimeCache(AbstractVizResource<?, ?> resource) {
TimeCache cache = timeCacheMap.get(resource);
if (cache == null) {
cache = new TimeCache();
timeCacheMap.put(resource, cache);
synchronized (timeCacheMap) {
TimeCache cache = timeCacheMap.get(resource);
if (cache == null) {
cache = new TimeCache();
timeCacheMap.put(resource, cache);
}
return cache;
}
return cache;
}
/**
@ -734,7 +758,9 @@ public class D2DTimeMatcher extends AbstractTimeMatcher {
timeMatchBasis = null;
}
}
timeCacheMap.remove(resource);
synchronized (timeCacheMap) {
timeCacheMap.remove(resource);
}
}
/**
@ -833,7 +859,9 @@ public class D2DTimeMatcher extends AbstractTimeMatcher {
.getLoadProperties());
config.setTimeMatchBasis(false);
TimeCache timeCache = getTimeCache(timeMatchBasis);
timeCache.setTimes(null, null);
synchronized (timeCache) {
timeCache.setTimes(null, null);
}
timeMatchBasis
.unregisterListener(timeMatchBasisDisposeListener);
}
@ -845,7 +873,9 @@ public class D2DTimeMatcher extends AbstractTimeMatcher {
.getLoadProperties());
config.setTimeMatchBasis(true);
TimeCache timeCache = getTimeCache(timeMatchBasis);
timeCache.setTimes(null, null);
synchronized (timeCache) {
timeCache.setTimes(null, null);
}
timeMatchBasis.registerListener(timeMatchBasisDisposeListener);
}
}