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); } }
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); } }