Compare commits
6 Commits
728eaf88fb
...
v0.19.0
Author | SHA1 | Date | |
---|---|---|---|
4acf163b42 | |||
e1fd528607 | |||
1c57368f43 | |||
1c5e18b92e | |||
07b388eecb | |||
20ae6465d6 |
5
dub.json
5
dub.json
@ -13,10 +13,7 @@
|
|||||||
"tanya:meta": "*",
|
"tanya:meta": "*",
|
||||||
"tanya:os": "*",
|
"tanya:os": "*",
|
||||||
"tanya:middle": "*",
|
"tanya:middle": "*",
|
||||||
"tanya:test": "*"
|
"tanya:test": "*",
|
||||||
},
|
|
||||||
|
|
||||||
"dependencies-linux": {
|
|
||||||
"mir-linux-kernel": "~>1.0.0"
|
"mir-linux-kernel": "~>1.0.0"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -2128,7 +2128,7 @@ if (isCallable!F)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
enum getDefault(T[i .. i + 1] name)
|
auto getDefault(T[i .. i + 1] name)
|
||||||
{
|
{
|
||||||
return name[0];
|
return name[0];
|
||||||
}
|
}
|
||||||
|
@ -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