protected CacheMapEntry CreateEntry(Type entityType, Object id, sbyte idIndex, Object value, CacheMapEntry nextEntry) { ICacheMapEntryFactory factory = cacheMapEntryTypeProvider.GetCacheMapEntryType(entityType, idIndex); return(factory.CreateCacheMapEntry(entityType, idIndex, id, value, nextEntry)); }
public ICacheMapEntryFactory GetCacheMapEntryType(Type entityType, sbyte idIndex) { if (BytecodeEnhancer == null) { return(ci); } ICacheMapEntryFactory factory = typeToConstructorMap.Get(entityType, idIndex); if (factory != null) { return(factory); } Lock writeLock = this.writeLock; writeLock.Lock(); try { // concurrent thread might have been faster factory = typeToConstructorMap.Get(entityType, idIndex); if (factory != null) { return(factory); } try { Type enhancedType = BytecodeEnhancer.GetEnhancedType(typeof(CacheMapEntry), new CacheMapEntryEnhancementHint(entityType, idIndex)); if (enhancedType == typeof(CacheMapEntry)) { // Nothing has been enhanced factory = ci; } else { factory = AccessorTypeProvider.GetConstructorType <ICacheMapEntryFactory>(enhancedType); } } catch (Exception e) { if (Log.WarnEnabled) { Log.Warn(e); } // something serious happened during enhancement: continue with a fallback factory = ci; } typeToConstructorMap.Put(entityType, idIndex, factory); return(factory); } finally { writeLock.Unlock(); } }