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);
                }
            }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }