public ArrayFreeList( int smallBlockSize, int largeBlockSize, int smallItemMaxBytes, SharedBlockArrayFreeList <T> sharedBlockLists, SharedBlockFreeList <object> sharedEmptySmallBlocksList, SharedBlockFreeList <object> sharedEmptyLargeBlocksList) { long sizeofT = SizeOf <T>(); countInUse = 0; this.sharedEmptySmallBlocksList = sharedEmptySmallBlocksList; this.sharedEmptyLargeBlocksList = sharedEmptyLargeBlocksList; freeLists = new SimpleFreeList <T[]> [32]; largeStartIndex = -1; for (int i = 0; i < freeLists.Length; i++) { bool large = sizeofT * (1L << i) > smallItemMaxBytes; if ((largeStartIndex == -1) && large) { largeStartIndex = i; } freeLists[i] = new SimpleFreeList <T[]>( large ? largeBlockSize : smallBlockSize, sharedBlockLists[i], large ? sharedEmptyLargeBlocksList : sharedEmptySmallBlocksList); } }
public static void Free <T>(ref SimpleFreeList <T> freelist, ref T item) where T : class, new() { T localItem = item; item = null; if (!EnableFreeLists) { return; } freelist.Push(localItem); }
public static T New <T>(ref SimpleFreeList <T> freelist) where T : class, new() { if (!EnableFreeLists) { return(new T()); } T item = freelist.TryNew(); if (item == null) { freelist.IncInUse(); item = new T(); } return(item); }