Merge remote-tracking branch 'n8sh/windows-iface-mmappool'
This commit is contained in:
		@@ -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,7 +209,10 @@ final class MmapPool : Allocator
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                block.region.next.prev = block.region.prev;
 | 
					                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.
 | 
					        // Merge blocks if neigbours are free.
 | 
				
			||||||
        if (block.next !is null && block.next.free)
 | 
					        if (block.next !is null && block.next.free)
 | 
				
			||||||
@@ -380,15 +400,29 @@ final class MmapPool : Allocator
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            return null;
 | 
					            return null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        void* p = mapMemory(null,
 | 
					        version (Windows)
 | 
				
			||||||
                regionSize,
 | 
					 | 
				
			||||||
                PROT_READ | PROT_WRITE,
 | 
					 | 
				
			||||||
                MAP_PRIVATE | MAP_ANONYMOUS,
 | 
					 | 
				
			||||||
                -1,
 | 
					 | 
				
			||||||
                0);
 | 
					 | 
				
			||||||
        if (cast(ptrdiff_t) p == -1)
 | 
					 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            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;
 | 
					        Region region = cast(Region) p;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user