private static void TestSequential(int count)
        {
            BitArray array = new BitArray(true, count);
            for (int x = 0; x < count; x++)
            {
                if (!array.GetBit(x))
                    throw new Exception("each bit should be set");
            }

            array = new BitArray(false, count);
            for (int x = 0; x < count; x++)
            {
                if (array.GetBit(x))
                    throw new Exception("each bit should be cleared");
            }
            for (int x = 0; x < count; x++)
            {
                array.SetBit(x);
                if (!array.GetBit(x))
                    throw new Exception("each bit should be cleared");
                array.ClearBit(x);
                if (array.GetBit(x))
                    throw new Exception("each bit should be cleared");
                array.SetBit(x);

                if (array.FindClearedBit() != (x == count - 1 ? -1 : x + 1))
                    throw new Exception();
            }
        }
Exemple #2
0
        /// <summary>
        /// Frees a block of memory
        /// </summary>
        /// <param name="address">The address</param>
        public static unsafe void Free(void *address)
        {
            uint bit = (uint)address / 0x1000;

            mutex.Lock();
            bitmap.ClearBit((int)bit);
            mutex.Unlock();
        }
Exemple #3
0
        private static void TestSequentialInv(int count)
        {
            BitArray array = new BitArray(false, count);

            for (int x = 0; x < count; x++)
            {
                if (array.GetBit(x))
                {
                    throw new Exception("each bit should be cleared");
                }
            }

            array = new BitArray(true, count);
            for (int x = 0; x < count; x++)
            {
                if (!array.GetBit(x))
                {
                    throw new Exception("each bit should be set");
                }
            }
            for (int x = 0; x < count; x++)
            {
                array.ClearBit(x);
                if (array.GetBit(x))
                {
                    throw new Exception("each bit should be cleared");
                }
                array.SetBit(x);
                if (!array.GetBit(x))
                {
                    throw new Exception("each bit should be cleared");
                }
                array.ClearBit(x);

                if (array.FindSetBit() != (x == count - 1 ? -1 : x + 1))
                {
                    throw new Exception();
                }
            }
        }
Exemple #4
0
        /// <summary>
        /// Requests a new block from the buffer pool.
        /// </summary>
        /// <param name="index">the index identifier of the block</param>
        /// <param name="addressPointer">the address to the start of the block</param>
        /// <exception cref="OutOfMemoryException">Thrown if the list is full</exception>
        public bool TryGetNextPage(out int index, out IntPtr addressPointer)
        {
            lock (m_syncRoot)
            {
                if (m_disposed)
                {
                    throw new ObjectDisposedException(GetType().FullName);
                }

                index = m_isPageFree.FindSetBit();
                if (index < 0)
                {
                    index          = -1;
                    addressPointer = IntPtr.Zero;
                    return(false);
                }

                m_usedPageCount++;
                m_isPageFree.ClearBit(index);

                int    allocationIndex = index >> m_pagesPerMemoryBlockShiftBits;
                int    blockOffset     = index & m_pagesPerMemoryBlockMask;
                Memory block           = m_memoryBlocks[allocationIndex];
                if (block == null)
                {
                    Log.Publish(MessageLevel.Warning, MessageFlags.BugReport, "Memory Block inside Memory Pool is null. Possible race condition.");
                    throw new NullReferenceException("Memory Block is null");
                }
                if (block.Address == IntPtr.Zero)
                {
                    Log.Publish(MessageLevel.Warning, MessageFlags.BugReport, "Memory Block inside Memory Pool was released prematurely. Possible race condition.");
                    throw new NullReferenceException("Memory Block is null");
                }

                addressPointer = block.Address + blockOffset * PageSize;

                index++;
                return(true);
            }
        }
        public void BitArray()
        {
            MemoryPoolTest.TestMemoryLeak();
            Stopwatch sw1 = new Stopwatch();
            Stopwatch sw2 = new Stopwatch();
            Stopwatch sw3 = new Stopwatch();
            Stopwatch sw4 = new Stopwatch();
            Stopwatch sw5 = new Stopwatch();
            Stopwatch sw6 = new Stopwatch();

            const int count = 20 * 1024 * 1024;

            //20 million, That's like 120GB of 64KB pages
            BitArray array = new BitArray(false, count);

            sw1.Start();
            for (int x = 0; x < count; x++)
            {
                array.SetBit(x);
            }
            sw1.Stop();

            sw2.Start();
            for (int x = 0; x < count; x++)
            {
                array.SetBit(x);
            }
            sw2.Stop();

            sw3.Start();
            for (int x = 0; x < count; x++)
            {
                array.ClearBit(x);
            }
            sw3.Stop();

            sw4.Start();
            for (int x = 0; x < count; x++)
            {
                array.ClearBit(x);
            }
            sw4.Stop();

            sw5.Start();
            for (int x = 0; x < count; x++)
            {
                if (array.GetBitUnchecked(x))
                {
                    throw new Exception();
                }
            }
            sw5.Stop();

            //for (int x = 0; x < count -1; x++)
            //{
            //    array.SetBit(x);
            //}

            sw6.Start();
            for (int x = 0; x < count; x++)
            {
                array.SetBit(array.FindClearedBit());
            }
            sw6.Stop();

            System.Console.WriteLine("Set Bits: " + (count / sw1.Elapsed.TotalSeconds / 1000000).ToString("0.0 MPP"));
            System.Console.WriteLine("Set Bits Again: " + (count / sw2.Elapsed.TotalSeconds / 1000000).ToString("0.0 MPP"));
            System.Console.WriteLine("Clear Bits: " + (count / sw3.Elapsed.TotalSeconds / 1000000).ToString("0.0 MPP"));
            System.Console.WriteLine("Clear Bits Again: " + (count / sw4.Elapsed.TotalSeconds / 1000000).ToString("0.0 MPP"));
            System.Console.WriteLine("Get Bits: " + (count / sw5.Elapsed.TotalSeconds / 1000000).ToString("0.0 MPP"));
            System.Console.WriteLine("Find Cleared Bit (All bits cleared): " + (count / sw6.Elapsed.TotalSeconds / 1000000).ToString("0.0 MPP"));
            MemoryPoolTest.TestMemoryLeak();
        }
        public void BitArray()
        {
            MemoryPoolTest.TestMemoryLeak();
            Stopwatch sw1 = new Stopwatch();
            Stopwatch sw2 = new Stopwatch();
            Stopwatch sw3 = new Stopwatch();
            Stopwatch sw4 = new Stopwatch();
            Stopwatch sw5 = new Stopwatch();
            Stopwatch sw6 = new Stopwatch();

            const int count = 20 * 1024 * 1024;

            //20 million, That's like 120GB of 64KB pages
            BitArray array = new BitArray(false, count);

            sw1.Start();
            for (int x = 0; x < count; x++)
            {
                array.SetBit(x);
            }
            sw1.Stop();

            sw2.Start();
            for (int x = 0; x < count; x++)
            {
                array.SetBit(x);
            }
            sw2.Stop();

            sw3.Start();
            for (int x = 0; x < count; x++)
            {
                array.ClearBit(x);
            }
            sw3.Stop();

            sw4.Start();
            for (int x = 0; x < count; x++)
            {
                array.ClearBit(x);
            }
            sw4.Stop();

            sw5.Start();
            for (int x = 0; x < count; x++)
            {
                if (array.GetBitUnchecked(x))
                    throw new Exception();

            }
            sw5.Stop();

            //for (int x = 0; x < count -1; x++)
            //{
            //    array.SetBit(x);
            //}

            sw6.Start();
            for (int x = 0; x < count; x++)
            {
                array.SetBit(array.FindClearedBit());
            }
            sw6.Stop();

            System.Console.WriteLine("Set Bits: " + (count / sw1.Elapsed.TotalSeconds / 1000000).ToString("0.0 MPP"));
            System.Console.WriteLine("Set Bits Again: " + (count / sw2.Elapsed.TotalSeconds / 1000000).ToString("0.0 MPP"));
            System.Console.WriteLine("Clear Bits: " + (count / sw3.Elapsed.TotalSeconds / 1000000).ToString("0.0 MPP"));
            System.Console.WriteLine("Clear Bits Again: " + (count / sw4.Elapsed.TotalSeconds / 1000000).ToString("0.0 MPP"));
            System.Console.WriteLine("Get Bits: " + (count / sw5.Elapsed.TotalSeconds / 1000000).ToString("0.0 MPP"));
            System.Console.WriteLine("Find Cleared Bit (All bits cleared): " + (count / sw6.Elapsed.TotalSeconds / 1000000).ToString("0.0 MPP"));
            MemoryPoolTest.TestMemoryLeak();
        }