Skip to main content



      Home
Home » Eclipse Projects » Dynamic Languages Toolkit (DLTK) » MixinModel lacks thread safety (DLTK 2.0)(MixinModel synchronizes cache but not other data structures....)
MixinModel lacks thread safety (DLTK 2.0) [message #653017] Mon, 07 February 2011 20:17
Eclipse UserFriend
org.eclipse.dltk.core.mixin.MixinModel is only partially synchronized.

We have multiple threads attempting to use the index and they get into strife calling get(String) on MixinModel. The reason is simple:

	public IMixinElement get(String key) {
		if (DLTKCore.VERBOSE) {
			System.out.println("MixinModel.get(" + key + ')'); //$NON-NLS-1$
		}
		if (notExistKeysCache.contains(key)) {
			return null;
		}
		if (removes == 0) {
			if (cache.get(key) == null) {
				return null;
			}
		}
		MixinElement element = getCreateEmpty(key);
		if (DLTKCore.VERBOSE) {
			System.out.println("Filling ratio:" + this.cache.fillingRatio()); //$NON-NLS-1$
			this.cache.printStats();
		}
		buildElementTree(element);
		if (element.isFinal() && element.sourceModules.size() > 0) {
			existKeysCache.add(key);
			return element;
		}
		notExistKeysCache.add(key);
		synchronized (this.cache) {
			cache.remove(element.key);
			cache.resetSpaceLimit(CACHE_LIMIT, element);
		}
		return null;
	}


The class members existKeysCache and notExistKeysCache are not synchronized. Multiple threads can access them. The calls to add(key) on the HashMap result in two threads trying to modify the map simultaneously. Specifically a rehash(). This seems to cause the HashMap to either blow up or infinitely loop inside AnalyzeMap().

The solution would be to synchronize these other members as well as the cache.

- Carl.
Previous Topic:DLTK 2.0 CLEAN_BUILD broken?
Next Topic:Save file generates multiple builds
Goto Forum:
  


Current Time: Fri Jul 04 04:28:05 EDT 2025

Powered by FUDForum. Page generated in 0.03825 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top