tsan: port to freebsd

llvm-svn: 211418
This commit is contained in:
Dmitry Vyukov 2014-06-20 22:51:18 +00:00
parent f9c22916d5
commit b820599a3a
1 changed files with 16 additions and 2 deletions

View File

@ -14,7 +14,7 @@
#include "sanitizer_common/sanitizer_platform.h"
#if SANITIZER_LINUX
#if SANITIZER_LINUX || SANITIZER_FREEBSD
#include "sanitizer_common/sanitizer_common.h"
#include "sanitizer_common/sanitizer_libc.h"
@ -42,8 +42,10 @@
#include <errno.h>
#include <sched.h>
#include <dlfcn.h>
#if SANITIZER_LINUX
#define __need_res_state
#include <resolv.h>
#endif
#ifdef sa_handler
# undef sa_handler
@ -53,6 +55,11 @@
# undef sa_sigaction
#endif
#if SANITIZER_FREEBSD
extern "C" void *__libc_stack_end;
void *__libc_stack_end = 0;
#endif
namespace __tsan {
const uptr kPageSize = 4096;
@ -107,15 +114,18 @@ uptr GetRSS() {
return mem[6];
}
#if SANITIZER_LINUX
void FlushShadowMemoryCallback(
const SuspendedThreadsList &suspended_threads_list,
void *argument) {
FlushUnneededShadowMemory(kLinuxShadowBeg, kLinuxShadowEnd - kLinuxShadowBeg);
}
#endif
void FlushShadowMemory() {
#if SANITIZER_LINUX
StopTheWorld(FlushShadowMemoryCallback, 0);
#endif
}
#ifndef TSAN_GO
@ -360,6 +370,7 @@ bool IsGlobalVar(uptr addr) {
// This is required to properly "close" the fds, because we do not see internal
// closes within glibc. The code is a pure hack.
int ExtractResolvFDs(void *state, int *fds, int nfd) {
#if SANITIZER_LINUX
int cnt = 0;
__res_state *statp = (__res_state*)state;
for (int i = 0; i < MAXNS && cnt < nfd; i++) {
@ -367,6 +378,9 @@ int ExtractResolvFDs(void *state, int *fds, int nfd) {
fds[cnt++] = statp->_u._ext.nssocks[i];
}
return cnt;
#else
return 0;
#endif
}
// Extract file descriptors passed via UNIX domain sockets.