This source file includes following definitions.
- runtimeツキSysAlloc
- runtimeツキSysUnused
- runtimeツキSysUsed
- runtimeツキSysFree
- runtimeツキSysFault
- runtimeツキSysReserve
- runtimeツキSysMap
#include "runtime.h"
#include "arch_GOARCH.h"
#include "defs_GOOS_GOARCH.h"
#include "os_GOOS.h"
#include "malloc.h"
enum
{
ENOMEM = 12,
};
void*
runtimeツキSysAlloc(uintptr n, uint64 *stat)
{
void *v;
v = runtimeツキmmap(nil, n, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0);
if(v < (void*)4096)
return nil;
runtimeツキxadd64(stat, n);
return v;
}
void
runtimeツキSysUnused(void *v, uintptr n)
{
runtimeツキmadvise(v, n, MADV_FREE);
}
void
runtimeツキSysUsed(void *v, uintptr n)
{
USED(v);
USED(n);
}
void
runtimeツキSysFree(void *v, uintptr n, uint64 *stat)
{
runtimeツキxadd64(stat, -(uint64)n);
runtimeツキmunmap(v, n);
}
void
runtimeツキSysFault(void *v, uintptr n)
{
runtimeツキmmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0);
}
void*
runtimeツキSysReserve(void *v, uintptr n, bool *reserved)
{
void *p;
if(sizeof(void*) == 8 && n > 1LL<<32) {
*reserved = false;
return v;
}
p = runtimeツキmmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE, -1, 0);
if(p < (void*)4096)
return nil;
*reserved = true;
return p;
}
void
runtimeツキSysMap(void *v, uintptr n, bool reserved, uint64 *stat)
{
void *p;
runtimeツキxadd64(stat, n);
if(!reserved) {
p = runtimeツキmmap(v, n, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0);
if(p == (void*)ENOMEM)
runtimeツキthrow("runtime: out of memory");
if(p != v) {
runtimeツキprintf("runtime: address space conflict: map(%p) = %p\n", v, p);
runtimeツキthrow("runtime: address space conflict");
}
return;
}
p = runtimeツキmmap(v, n, PROT_READ|PROT_WRITE, MAP_ANON|MAP_FIXED|MAP_PRIVATE, -1, 0);
if(p == (void*)ENOMEM)
runtimeツキthrow("runtime: out of memory");
if(p != v)
runtimeツキthrow("runtime: cannot map pages in arena address space");
}