コード例 #1
0
        public EphemeralBufferPoolWindows(int bufferSize, int bufferCount)
        {
            if (bufferSize < 1)
            {
                throw new ArgumentOutOfRangeException(nameof(bufferSize));
            }
            if (bufferCount < 1)
            {
                throw new ArgumentOutOfRangeException(nameof(bufferSize));
            }

            SYSTEM_INFO sysInfo;

            GetSystemInfo(out sysInfo);
            var pages          = (int)Math.Ceiling((bufferCount * bufferSize) / (double)sysInfo.dwPageSize);
            var totalAllocated = pages * sysInfo.dwPageSize;

            _bufferCount    = totalAllocated / bufferSize;
            _bufferSize     = bufferSize;
            _totalAllocated = new UIntPtr((uint)totalAllocated);

            _memory = VirtualAlloc(IntPtr.Zero, _totalAllocated, MemOptions.MEM_COMMIT | MemOptions.MEM_RESERVE, PageOptions.PAGE_READWRITE);
            VirtualLock(_memory, _totalAllocated);
            for (var i = 0; i < totalAllocated; i += bufferSize)
            {
                var mem = new EphemeralMemory(IntPtr.Add(_memory, i), bufferSize);
                _buffers.Enqueue(mem);
            }
        }
コード例 #2
0
        public EphemeralBufferPoolUnix(int bufferSize, int bufferCount)
        {
            if (bufferSize < 1)
            {
                throw new ArgumentOutOfRangeException(nameof(bufferSize));
            }
            if (bufferCount < 1)
            {
                throw new ArgumentOutOfRangeException(nameof(bufferSize));
            }

            var pageSize = SysConf(SysConfName._SC_PAGESIZE);

            if (pageSize < 0)
            {
                ExceptionHelper.ThrowException(new InvalidOperationException("Unable to get system page size"));
            }
            var pages = (int)Math.Ceiling((bufferCount * bufferSize) / (double)pageSize);

            _totalAllocated = pages * pageSize;
            _bufferCount    = (int)_totalAllocated / bufferSize;
            _bufferSize     = bufferSize;
            _memory         = MMap(IntPtr.Zero, (ulong)_totalAllocated, MemoryMappedProtections.PROT_READ | MemoryMappedProtections.PROT_WRITE, MemoryMappedFlags.MAP_PRIVATE | MemoryMappedFlags.MAP_ANONYMOUS, new IntPtr(-1), 0);
            if (_memory.ToInt64() < 0)
            {
                ExceptionHelper.ThrowException(new InvalidOperationException("Unable to get system page size"));
            }
            if (MLock(_memory, (ulong)_totalAllocated) < 0)
            {
                ExceptionHelper.ThrowException(new InvalidOperationException("Unable to get system page size"));
            }

            for (var i = 0; i < _totalAllocated; i += bufferSize)
            {
                var mem = new EphemeralMemory(IntPtr.Add(_memory, i), bufferSize);
                _buffers.Enqueue(mem);
            }
        }