コード例 #1
0
ファイル: DeltaBaseCache.cs プロジェクト: ashmind/ngit
 private static void ClearEntry(DeltaBaseCache.Slot e)
 {
     openByteCount -= e.sz;
     e.provider     = null;
     e.data         = DEAD;
     e.sz           = 0;
 }
コード例 #2
0
 internal virtual void Store(PackFile pack, long position, byte[] data, int objectType
                             )
 {
     if (data.Length > maxByteCount)
     {
         return;
     }
     // Too large to cache.
     DeltaBaseCache.Slot e = cache[Hash(position)];
     if (e == null)
     {
         e = new DeltaBaseCache.Slot();
         cache[Hash(position)] = e;
     }
     else
     {
         ClearEntry(e);
     }
     openByteCount += data.Length;
     ReleaseMemory();
     e.provider = pack;
     e.position = position;
     e.sz       = data.Length;
     e.data     = new SoftReference <DeltaBaseCache.Entry>(new DeltaBaseCache.Entry(data, objectType
                                                                                    ));
     MoveToHead(e);
 }
コード例 #3
0
		static DeltaBaseCache()
		{
			DEAD = new SoftReference<DeltaBaseCache.Entry>(null);
			maxByteCount = new WindowCacheConfig().GetDeltaBaseCacheLimit();
			cache = new DeltaBaseCache.Slot[CACHE_SZ];
			for (int i = 0; i < CACHE_SZ; i++)
			{
				cache[i] = new DeltaBaseCache.Slot();
			}
		}
コード例 #4
0
ファイル: DeltaBaseCache.cs プロジェクト: ashmind/ngit
 static DeltaBaseCache()
 {
     DEAD         = new SoftReference <DeltaBaseCache.Entry>(null);
     maxByteCount = new WindowCacheConfig().GetDeltaBaseCacheLimit();
     cache        = new DeltaBaseCache.Slot[CACHE_SZ];
     for (int i = 0; i < CACHE_SZ; i++)
     {
         cache[i] = new DeltaBaseCache.Slot();
     }
 }
コード例 #5
0
ファイル: DeltaBaseCache.cs プロジェクト: ashmind/ngit
 private static void Unlink(DeltaBaseCache.Slot e)
 {
     DeltaBaseCache.Slot prev = e.lruPrev;
     DeltaBaseCache.Slot next = e.lruNext;
     if (prev != null)
     {
         prev.lruNext = next;
     }
     if (next != null)
     {
         next.lruPrev = prev;
     }
 }
コード例 #6
0
ファイル: DeltaBaseCache.cs プロジェクト: ashmind/ngit
 private static void MoveToHead(DeltaBaseCache.Slot e)
 {
     Unlink(e);
     e.lruPrev = null;
     e.lruNext = lruHead;
     if (lruHead != null)
     {
         lruHead.lruPrev = e;
     }
     else
     {
         lruTail = e;
     }
     lruHead = e;
 }
コード例 #7
0
ファイル: DeltaBaseCache.cs プロジェクト: ashmind/ngit
 internal static DeltaBaseCache.Entry Get(PackFile pack, long position)
 {
     lock (typeof(DeltaBaseCache))
     {
         DeltaBaseCache.Slot e = cache[Hash(position)];
         if (e.provider == pack && e.position == position)
         {
             DeltaBaseCache.Entry buf = e.data.Get();
             if (buf != null)
             {
                 MoveToHead(e);
                 return(buf);
             }
         }
         return(null);
     }
 }
コード例 #8
0
 internal virtual DeltaBaseCache.Entry Get(PackFile pack, long position)
 {
     DeltaBaseCache.Slot e = cache[Hash(position)];
     if (e == null)
     {
         return(null);
     }
     if (e.provider == pack && e.position == position)
     {
         DeltaBaseCache.Entry buf = e.data.Get();
         if (buf != null)
         {
             MoveToHead(e);
             return(buf);
         }
     }
     return(null);
 }
コード例 #9
0
ファイル: DeltaBaseCache.cs プロジェクト: ashmind/ngit
 private static void ReleaseMemory()
 {
     while (openByteCount > maxByteCount && lruTail != null)
     {
         DeltaBaseCache.Slot currOldest = lruTail;
         DeltaBaseCache.Slot nextOldest = currOldest.lruPrev;
         ClearEntry(currOldest);
         currOldest.lruPrev = null;
         currOldest.lruNext = null;
         if (nextOldest == null)
         {
             lruHead = null;
         }
         else
         {
             nextOldest.lruNext = null;
         }
         lruTail = nextOldest;
     }
 }
コード例 #10
0
ファイル: DeltaBaseCache.cs プロジェクト: ashmind/ngit
 internal static void Store(PackFile pack, long position, byte[] data, int objectType
                            )
 {
     lock (typeof(DeltaBaseCache))
     {
         if (data.Length > maxByteCount)
         {
             return;
         }
         // Too large to cache.
         DeltaBaseCache.Slot e = cache[Hash(position)];
         ClearEntry(e);
         openByteCount += data.Length;
         ReleaseMemory();
         e.provider = pack;
         e.position = position;
         e.sz       = data.Length;
         e.data     = new SoftReference <DeltaBaseCache.Entry>(new DeltaBaseCache.Entry(data, objectType
                                                                                        ));
         MoveToHead(e);
     }
 }
コード例 #11
0
		private static void MoveToHead(DeltaBaseCache.Slot e)
		{
			Unlink(e);
			e.lruPrev = null;
			e.lruNext = lruHead;
			if (lruHead != null)
			{
				lruHead.lruPrev = e;
			}
			else
			{
				lruTail = e;
			}
			lruHead = e;
		}
コード例 #12
0
		private static void ReleaseMemory()
		{
			while (openByteCount > maxByteCount && lruTail != null)
			{
				DeltaBaseCache.Slot currOldest = lruTail;
				DeltaBaseCache.Slot nextOldest = currOldest.lruPrev;
				ClearEntry(currOldest);
				currOldest.lruPrev = null;
				currOldest.lruNext = null;
				if (nextOldest == null)
				{
					lruHead = null;
				}
				else
				{
					nextOldest.lruNext = null;
				}
				lruTail = nextOldest;
			}
		}
コード例 #13
0
ファイル: DeltaBaseCache.cs プロジェクト: LunarLanding/ngit
		internal virtual void Store(PackFile pack, long position, byte[] data, int objectType
			)
		{
			if (data.Length > maxByteCount)
			{
				return;
			}
			// Too large to cache.
			DeltaBaseCache.Slot e = cache[Hash(position)];
			if (e == null)
			{
				e = new DeltaBaseCache.Slot();
				cache[Hash(position)] = e;
			}
			else
			{
				ClearEntry(e);
			}
			openByteCount += data.Length;
			ReleaseMemory();
			e.provider = pack;
			e.position = position;
			e.sz = data.Length;
			e.data = new SoftReference<DeltaBaseCache.Entry>(new DeltaBaseCache.Entry(data, objectType
				));
			MoveToHead(e);
		}