1
0
mirror of https://github.com/golang/go synced 2024-09-30 07:28:36 -06:00

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 <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>
This commit is contained in:
Bryan C. Mills 2017-05-25 14:30:23 -04:00 committed by Bryan Mills
parent c31231ccab
commit a8dd20d389

View 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;
}