Merge remote-tracking branch 'n8sh/windows-iface-mmappool'

This commit is contained in:
Eugen Wissner 2023-09-23 16:16:33 +02:00
commit 1c57368f43
2 changed files with 65 additions and 17 deletions

View File

@ -19,13 +19,30 @@ import tanya.memory.allocator;
import tanya.memory.op; import tanya.memory.op;
import tanya.os.error; import tanya.os.error;
extern(C) pragma(mangle, "mmap") version (Windows)
private void* mapMemory(void *addr, size_t length, int prot, int flags, int fd, off_t offset) {
@nogc nothrow pure @system; import core.sys.windows.basetsd : SIZE_T;
import core.sys.windows.windef : BOOL, DWORD;
import core.sys.windows.winnt : MEM_COMMIT, MEM_RELEASE, PAGE_READWRITE, PVOID;
extern(C) pragma(mangle, "munmap") extern (Windows)
private bool unmapMemory(shared void* addr, size_t length) private PVOID VirtualAlloc(PVOID, SIZE_T, DWORD, DWORD)
@nogc nothrow pure @system; @nogc nothrow pure @system;
extern (Windows)
private BOOL VirtualFree(shared PVOID, SIZE_T, DWORD)
@nogc nothrow pure @system;
}
else
{
extern(C) pragma(mangle, "mmap")
private void* mapMemory(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
@nogc nothrow pure @system;
extern(C) pragma(mangle, "munmap")
private bool unmapMemory(shared void* addr, size_t length)
@nogc nothrow pure @system;
}
/* /*
* This allocator allocates memory in regions (multiple of 64 KB for example). * This allocator allocates memory in regions (multiple of 64 KB for example).
@ -192,6 +209,9 @@ final class MmapPool : Allocator
{ {
block.region.next.prev = block.region.prev; block.region.next.prev = block.region.prev;
} }
version (Windows)
return VirtualFree(block.region, 0, MEM_RELEASE) != 0;
else
return unmapMemory(block.region, block.region.size) == 0; return unmapMemory(block.region, block.region.size) == 0;
} }
// Merge blocks if neigbours are free. // Merge blocks if neigbours are free.
@ -380,6 +400,19 @@ final class MmapPool : Allocator
{ {
return null; return null;
} }
version (Windows)
{
void* p = VirtualAlloc(null,
regionSize,
MEM_COMMIT,
PAGE_READWRITE);
if (p is null)
{
return null;
}
}
else
{
void* p = mapMemory(null, void* p = mapMemory(null,
regionSize, regionSize,
PROT_READ | PROT_WRITE, PROT_READ | PROT_WRITE,
@ -390,6 +423,7 @@ final class MmapPool : Allocator
{ {
return null; return null;
} }
}
Region region = cast(Region) p; Region region = cast(Region) p;
region.blocks = 1; region.blocks = 1;

View File

@ -22,8 +22,22 @@ import tanya.range;
version (Windows) version (Windows)
{ {
import tanya.sys.windows.ifdef; private union NET_LUID_LH { ulong Value, Info; }
import tanya.sys.windows.iphlpapi; private alias NET_LUID = NET_LUID_LH;
private alias NET_IFINDEX = uint;
private enum IF_MAX_STRING_SIZE = 256;
extern(Windows) @nogc nothrow private @system
{
uint ConvertInterfaceNameToLuidA(const(char)* InterfaceName,
NET_LUID* InterfaceLuid);
uint ConvertInterfaceLuidToIndex(const(NET_LUID)* InterfaceLuid,
NET_IFINDEX* InterfaceIndex);
uint ConvertInterfaceIndexToLuid(NET_IFINDEX InterfaceIndex,
NET_LUID* InterfaceLuid);
uint ConvertInterfaceLuidToNameA(const(NET_LUID)* InterfaceLuid,
char* InterfaceName,
size_t Length);
}
} }
else version (Posix) else version (Posix)
{ {