]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: madvise and SysUnused for Darwin
authorDave Cheney <dave@cheney.net>
Thu, 19 Jan 2012 20:51:29 +0000 (15:51 -0500)
committerRuss Cox <rsc@golang.org>
Thu, 19 Jan 2012 20:51:29 +0000 (15:51 -0500)
SysUnused is a direct call to madvise MADV_FREE.

R=sebastien.paolacci, rsc, minux.ma
CC=golang-dev
https://golang.org/cl/5531073

src/pkg/runtime/defs_darwin.go
src/pkg/runtime/defs_darwin_386.h
src/pkg/runtime/defs_darwin_amd64.h
src/pkg/runtime/mem_darwin.c
src/pkg/runtime/sys_darwin_386.s
src/pkg/runtime/sys_darwin_amd64.s

index 80b7a4f27798eb6afb532557f0639ba178edca35..7f22b0b8e55dacfdb14382d16efe0213ff8bdaaf 100644 (file)
@@ -34,6 +34,9 @@ const (
        MAP_PRIVATE = C.MAP_PRIVATE
        MAP_FIXED   = C.MAP_FIXED
 
+       MADV_DONTNEED = C.MADV_DONTNEED
+       MADV_FREE     = C.MADV_FREE
+
        MACH_MSG_TYPE_MOVE_RECEIVE   = C.MACH_MSG_TYPE_MOVE_RECEIVE
        MACH_MSG_TYPE_MOVE_SEND      = C.MACH_MSG_TYPE_MOVE_SEND
        MACH_MSG_TYPE_MOVE_SEND_ONCE = C.MACH_MSG_TYPE_MOVE_SEND_ONCE
index 3606bad9413200f5eee3c4fb556f66a98101054e..92732f460246e423c9683351f2942228c5e78fc7 100644 (file)
@@ -12,6 +12,9 @@ enum {
        MAP_PRIVATE     = 0x2,
        MAP_FIXED       = 0x10,
 
+       MADV_DONTNEED   = 0x4,
+       MADV_FREE       = 0x5,
+
        MACH_MSG_TYPE_MOVE_RECEIVE      = 0x10,
        MACH_MSG_TYPE_MOVE_SEND         = 0x11,
        MACH_MSG_TYPE_MOVE_SEND_ONCE    = 0x12,
index c28225f4cfe5a53cb03f1f597e2425b133689744..d4fbfef4995001a1451d6cd5d7ece883631d6c80 100644 (file)
@@ -12,6 +12,9 @@ enum {
        MAP_PRIVATE     = 0x2,
        MAP_FIXED       = 0x10,
 
+       MADV_DONTNEED   = 0x4,
+       MADV_FREE       = 0x5,
+
        MACH_MSG_TYPE_MOVE_RECEIVE      = 0x10,
        MACH_MSG_TYPE_MOVE_SEND         = 0x11,
        MACH_MSG_TYPE_MOVE_SEND_ONCE    = 0x12,
index 3af7af99ae94a277338faab825b645778f2431ca..cde5601cf78d25ca957c576017f014e97d1c3bd1 100644 (file)
@@ -23,9 +23,8 @@ runtime·SysAlloc(uintptr n)
 void
 runtime·SysUnused(void *v, uintptr n)
 {
-       USED(v);
-       USED(n);
-       // TODO(rsc): call madvise MADV_DONTNEED
+       // Linux's MADV_DONTNEED is like BSD's MADV_FREE.
+       runtime·madvise(v, n, MADV_FREE);
 }
 
 void
index 6ce1ba5533c4730cd739a2909cb44d449fcc4991..b358509b191fe44218e63fb8d35960088e47406b 100644 (file)
@@ -48,6 +48,13 @@ TEXT runtime·mmap(SB),7,$0
        INT     $0x80
        RET
 
+TEXT runtime·madvise(SB),7,$0
+       MOVL    $75, AX
+       INT     $0x80
+       JAE     2(PC)
+       CALL    runtime·notok(SB)
+       RET
+
 TEXT runtime·munmap(SB),7,$0
        MOVL    $73, AX
        INT     $0x80
index e0dbdb7c169f6532b5711ebebbf1e1877d553d32..095ba2fa53257abb5af7a3776baa75278c4e65f7 100644 (file)
@@ -55,6 +55,16 @@ TEXT runtime·setitimer(SB), 7, $0
        SYSCALL
        RET
 
+TEXT runtime·madvise(SB), 7, $0
+       MOVQ    8(SP), DI               // arg 1 addr
+       MOVQ    16(SP), SI              // arg 2 len
+       MOVL    24(SP), DX              // arg 3 advice
+       MOVL    $(0x2000000+75), AX     // syscall entry madvise
+       SYSCALL
+       JCC     2(PC)
+       CALL    runtime·notok(SB)
+       RET
+
 // func now() (sec int64, nsec int32)
 TEXT time·now(SB), 7, $32
        MOVQ    SP, DI  // must be non-nil, unused