diff options
| -rw-r--r-- | middle/tanya/memory/mmappool.d | 64 | ||||
| -rw-r--r-- | source/tanya/net/iface.d | 18 |
2 files changed, 65 insertions, 17 deletions
diff --git a/middle/tanya/memory/mmappool.d b/middle/tanya/memory/mmappool.d index 5c25dd4..3ce49d5 100644 --- a/middle/tanya/memory/mmappool.d +++ b/middle/tanya/memory/mmappool.d @@ -19,13 +19,30 @@ import tanya.memory.allocator; import tanya.memory.op; import tanya.os.error; -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; +version (Windows) +{ + 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 (Windows) + private PVOID VirtualAlloc(PVOID, SIZE_T, DWORD, DWORD) + @nogc nothrow pure @system; -extern(C) pragma(mangle, "munmap") -private bool unmapMemory(shared void* addr, size_t length) -@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). @@ -192,7 +209,10 @@ final class MmapPool : Allocator { block.region.next.prev = block.region.prev; } - return unmapMemory(block.region, block.region.size) == 0; + version (Windows) + return VirtualFree(block.region, 0, MEM_RELEASE) != 0; + else + return unmapMemory(block.region, block.region.size) == 0; } // Merge blocks if neigbours are free. if (block.next !is null && block.next.free) @@ -380,15 +400,29 @@ final class MmapPool : Allocator { return null; } - void* p = mapMemory(null, - regionSize, - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, - -1, - 0); - if (cast(ptrdiff_t) p == -1) + version (Windows) { - return null; + void* p = VirtualAlloc(null, + regionSize, + MEM_COMMIT, + PAGE_READWRITE); + if (p is null) + { + return null; + } + } + else + { + void* p = mapMemory(null, + regionSize, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, + -1, + 0); + if (cast(ptrdiff_t) p == -1) + { + return null; + } } Region region = cast(Region) p; diff --git a/source/tanya/net/iface.d b/source/tanya/net/iface.d index 8e2675a..3bc165a 100644 --- a/source/tanya/net/iface.d +++ b/source/tanya/net/iface.d @@ -22,8 +22,22 @@ import tanya.range; version (Windows)
{
- import tanya.sys.windows.ifdef;
- import tanya.sys.windows.iphlpapi;
+ private union NET_LUID_LH { ulong Value, Info; }
+ 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)
{
|
