Coverity didn't like our non-locking of the get() method. The
lock is actually only needed for the registration/unregistration
of retrievers, the get() can access the ConcurrentHashMap
directly.
Add a few comments to help explain this.
Signed-off-by: Alexandre Montplaisir <alexmonthy@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
private final Map<String, IContextInfoRetriever> contextInfoRetrievers = new ConcurrentHashMap<String, IContextInfoRetriever>();
private final Map<String, Long> contextInforRetrieverRefs = new HashMap<String, Long>();
private final Map<String, IContextInfoRetriever> contextInfoRetrievers = new ConcurrentHashMap<String, IContextInfoRetriever>();
private final Map<String, Long> contextInforRetrieverRefs = new HashMap<String, Long>();
+ /**
+ * Lock used to keep the two maps above in sync when retrievers are
+ * registered or unregistered.
+ */
private final Object retrieverLock = new Object();
/** Singleton class, constructor should not be accessed directly */
private final Object retrieverLock = new Object();
/** Singleton class, constructor should not be accessed directly */
* was none
*/
public IContextInfoRetriever getContextInfoRetriever(String retrieverName) {
* was none
*/
public IContextInfoRetriever getContextInfoRetriever(String retrieverName) {
+ /*
+ * Note that this method does not take the retrieverLock, it lets
+ * concurrent threads access the ConcurrentHashMap directly.
+ *
+ * It's fine for a get() to happen during a registration or
+ * unregistration, it's first-come-first-serve.
+ */
return contextInfoRetrievers.get(retrieverName);
}
return contextInfoRetrievers.get(retrieverName);
}