]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/cgo: add TSAN annotations for C sigaction call
authorBryan C. Mills <bcmills@google.com>
Thu, 25 May 2017 18:30:23 +0000 (14:30 -0400)
committerBryan Mills <bcmills@google.com>
Fri, 26 May 2017 16:34:43 +0000 (16:34 +0000)
This avoids false-positive TSAN reports when using the C sigaction
function to read handlers registered by the Go runtime.

(Unfortunately, I can't seem to coax the runtime into reproducing the
failure in a small unit-test.)

Change-Id: I744279a163708e24b1fbe296ca691935c394b5f3
Reviewed-on: https://go-review.googlesource.com/44270
Run-TryBot: Bryan Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
src/runtime/cgo/gcc_sigaction.c

index 566097fa6d7684d77e0d2892474f017ed699dc2c..72fb08d720ea6ab90fdd35cb3845fcd65535af77 100644 (file)
@@ -10,6 +10,8 @@
 #include <string.h>
 #include <signal.h>
 
+#include "libcgo.h"
+
 // go_sigaction_t is a C version of the sigactiont struct from
 // defs_linux_amd64.go.  This definition — and its conversion to and from struct
 // sigaction — are specific to linux/amd64.
@@ -33,6 +35,8 @@ x_cgo_sigaction(intptr_t signum, const go_sigaction_t *goact, go_sigaction_t *ol
        struct sigaction oldact;
        int i;
 
+       _cgo_tsan_acquire();
+
        memset(&act, 0, sizeof act);
        memset(&oldact, 0, sizeof oldact);
 
@@ -53,7 +57,8 @@ x_cgo_sigaction(intptr_t signum, const go_sigaction_t *goact, go_sigaction_t *ol
 
        ret = sigaction(signum, goact ? &act : NULL, oldgoact ? &oldact : NULL);
        if (ret == -1) {
-               /* This is what the Go code expects on failure. */
+               // runtime.rt_sigaction expects _cgo_sigaction to return errno on error.
+               _cgo_tsan_release();
                return errno;
        }
 
@@ -72,5 +77,6 @@ x_cgo_sigaction(intptr_t signum, const go_sigaction_t *goact, go_sigaction_t *ol
                oldgoact->flags = oldact.sa_flags;
        }
 
+       _cgo_tsan_release();
        return ret;
 }