Issue #2159 Synchronize TimeCache access in D2DTimeMatcher.
Change-Id: I9116ced28775294385ea9ea92a1e63bf2fefff55 Former-commit-id:2d8e1e5e6c
[formerlya868d3d0b5
] [formerly53d969d0db
[formerly 3eaca3d7a18ab9c8ab601fc7ed9fb899eced1134]] Former-commit-id:53d969d0db
Former-commit-id:dde0846fc3
This commit is contained in:
parent
aef289d287
commit
b18f4bbe89
1 changed files with 62 additions and 32 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue