github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/runtime/mem_darwin.c (about) 1 // Copyright 2010 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 #include "runtime.h" 6 #include "arch_GOARCH.h" 7 #include "defs_GOOS_GOARCH.h" 8 #include "os_GOOS.h" 9 #include "malloc.h" 10 11 void* 12 runtime·SysAlloc(uintptr n) 13 { 14 void *v; 15 16 mstats.sys += n; 17 v = runtime·mmap(nil, n, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0); 18 if(v < (void*)4096) 19 return nil; 20 return v; 21 } 22 23 void 24 runtime·SysUnused(void *v, uintptr n) 25 { 26 // Linux's MADV_DONTNEED is like BSD's MADV_FREE. 27 runtime·madvise(v, n, MADV_FREE); 28 } 29 30 void 31 runtime·SysFree(void *v, uintptr n) 32 { 33 mstats.sys -= n; 34 runtime·munmap(v, n); 35 } 36 37 void* 38 runtime·SysReserve(void *v, uintptr n) 39 { 40 void *p; 41 42 p = runtime·mmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE, -1, 0); 43 if(p < (void*)4096) 44 return nil; 45 return p; 46 } 47 48 enum 49 { 50 ENOMEM = 12, 51 }; 52 53 void 54 runtime·SysMap(void *v, uintptr n) 55 { 56 void *p; 57 58 mstats.sys += n; 59 p = runtime·mmap(v, n, PROT_READ|PROT_WRITE, MAP_ANON|MAP_FIXED|MAP_PRIVATE, -1, 0); 60 if(p == (void*)ENOMEM) 61 runtime·throw("runtime: out of memory"); 62 if(p != v) 63 runtime·throw("runtime: cannot map pages in arena address space"); 64 }