From a8dd20d389a1364059c36202da6a2a655677f7d8 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 25 May 2017 14:30:23 -0400 Subject: [PATCH] runtime/cgo: add TSAN annotations for C sigaction call 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 TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor Reviewed-by: Dmitry Vyukov --- src/runtime/cgo/gcc_sigaction.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/runtime/cgo/gcc_sigaction.c b/src/runtime/cgo/gcc_sigaction.c index 566097fa6d..72fb08d720 100644 --- a/src/runtime/cgo/gcc_sigaction.c +++ b/src/runtime/cgo/gcc_sigaction.c @@ -10,6 +10,8 @@ #include #include +#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; }