]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: make use of THREAD_SHARE userspace mutex on freebsd
authorMikio Hara <mikioh.mikioh@gmail.com>
Wed, 12 Mar 2014 01:33:09 +0000 (10:33 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Wed, 12 Mar 2014 01:33:09 +0000 (10:33 +0900)
For now Note, futexsleep and futexwakeup are designed for threads,
not for processes. The explicit use of UMTX_OP_WAIT_UINT_PRIVATE and
UMTX_OP_WAKE_PRIVATE can avoid unnecessary traversals of VM objects,
to hit undiscovered bugs related to VM system on SMP/SMT/NUMA
environment.

Update #7496

LGTM=iant
R=golang-codereviews, gobot, iant, bradfitz
CC=golang-codereviews
https://golang.org/cl/72760043

src/pkg/runtime/defs_freebsd.go
src/pkg/runtime/defs_freebsd_386.h
src/pkg/runtime/defs_freebsd_amd64.h
src/pkg/runtime/defs_freebsd_arm.h
src/pkg/runtime/os_freebsd.c

index dad20f16dd8269b229991f26d97bf1b399306451..2832583e06c6ac2edfe36d0de5b57fd943f4b9af 100644 (file)
@@ -49,8 +49,10 @@ const (
        SA_RESTART = C.SA_RESTART
        SA_ONSTACK = C.SA_ONSTACK
 
-       UMTX_OP_WAIT_UINT = C.UMTX_OP_WAIT_UINT
-       UMTX_OP_WAKE      = C.UMTX_OP_WAKE
+       UMTX_OP_WAIT_UINT         = C.UMTX_OP_WAIT_UINT
+       UMTX_OP_WAIT_UINT_PRIVATE = C.UMTX_OP_WAIT_UINT_PRIVATE
+       UMTX_OP_WAKE              = C.UMTX_OP_WAKE
+       UMTX_OP_WAKE_PRIVATE      = C.UMTX_OP_WAKE_PRIVATE
 
        SIGHUP    = C.SIGHUP
        SIGINT    = C.SIGINT
index cf9c76eb1ab613a8ae883d605ba138f3322ac4e4..fab9385269bb89c35d3c60128a5a21bc7774be91 100644 (file)
@@ -21,8 +21,10 @@ enum {
        SA_RESTART      = 0x2,
        SA_ONSTACK      = 0x1,
 
-       UMTX_OP_WAIT_UINT       = 0xb,
-       UMTX_OP_WAKE            = 0x3,
+       UMTX_OP_WAIT_UINT               = 0xb,
+       UMTX_OP_WAIT_UINT_PRIVATE       = 0xf,
+       UMTX_OP_WAKE                    = 0x3,
+       UMTX_OP_WAKE_PRIVATE            = 0x10,
 
        SIGHUP          = 0x1,
        SIGINT          = 0x2,
index 3fb33f38a3fd5c73fdac4c9f1d274ee3b13832d4..c1db91803ed113acf337c107dc6d406254e11bf4 100644 (file)
@@ -21,8 +21,10 @@ enum {
        SA_RESTART      = 0x2,
        SA_ONSTACK      = 0x1,
 
-       UMTX_OP_WAIT_UINT       = 0xb,
-       UMTX_OP_WAKE            = 0x3,
+       UMTX_OP_WAIT_UINT               = 0xb,
+       UMTX_OP_WAIT_UINT_PRIVATE       = 0xf,
+       UMTX_OP_WAKE                    = 0x3,
+       UMTX_OP_WAKE_PRIVATE            = 0x10,
 
        SIGHUP          = 0x1,
        SIGINT          = 0x2,
index e868ca313e664ffafe2275bf23a06861f81601fd..4fc452e457db2f13a6f29b396b0270d092b1971d 100644 (file)
@@ -21,8 +21,10 @@ enum {
        SA_RESTART      = 0x2,
        SA_ONSTACK      = 0x1,
 
-       UMTX_OP_WAIT_UINT       = 0xb,
-       UMTX_OP_WAKE            = 0x3,
+       UMTX_OP_WAIT_UINT               = 0xb,
+       UMTX_OP_WAIT_UINT_PRIVATE       = 0xf,
+       UMTX_OP_WAKE                    = 0x3,
+       UMTX_OP_WAKE_PRIVATE            = 0x10,
 
        SIGHUP          = 0x1,
        SIGINT          = 0x2,
index 8b7b0f6263272b1ae03082daaa948fc7c2aed54e..7598b13ba51baa953de0cdbcea44550bc3e97375 100644 (file)
@@ -50,7 +50,7 @@ runtime·futexsleep(uint32 *addr, uint32 val, int64 ns)
        Timespec ts;
 
        if(ns < 0) {
-               ret = runtime·sys_umtx_op(addr, UMTX_OP_WAIT_UINT, val, nil, nil);
+               ret = runtime·sys_umtx_op(addr, UMTX_OP_WAIT_UINT_PRIVATE, val, nil, nil);
                if(ret >= 0 || ret == -EINTR)
                        return;
                goto fail;
@@ -58,7 +58,7 @@ runtime·futexsleep(uint32 *addr, uint32 val, int64 ns)
        // NOTE: tv_nsec is int64 on amd64, so this assumes a little-endian system.
        ts.tv_nsec = 0;
        ts.tv_sec = runtime·timediv(ns, 1000000000, (int32*)&ts.tv_nsec);
-       ret = runtime·sys_umtx_op(addr, UMTX_OP_WAIT_UINT, val, nil, &ts);
+       ret = runtime·sys_umtx_op(addr, UMTX_OP_WAIT_UINT_PRIVATE, val, nil, &ts);
        if(ret >= 0 || ret == -EINTR)
                return;
 
@@ -78,7 +78,7 @@ runtime·futexwakeup(uint32 *addr, uint32 cnt)
 {
        int32 ret;
 
-       ret = runtime·sys_umtx_op(addr, UMTX_OP_WAKE, cnt, nil, nil);
+       ret = runtime·sys_umtx_op(addr, UMTX_OP_WAKE_PRIVATE, cnt, nil, nil);
        if(ret >= 0)
                return;