forked from OSchip/llvm-project
66 lines
1.7 KiB
C++
66 lines
1.7 KiB
C++
//===-- tsan_sync_test.cc -------------------------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file is a part of ThreadSanitizer (TSan), a race detector.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#include "tsan_sync.h"
|
|
#include "tsan_rtl.h"
|
|
#include "tsan_mman.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <map>
|
|
|
|
namespace __tsan {
|
|
|
|
TEST(Sync, Table) {
|
|
const uintptr_t kIters = 512*1024;
|
|
const uintptr_t kRange = 10000;
|
|
|
|
ScopedInRtl in_rtl;
|
|
ThreadState *thr = cur_thread();
|
|
uptr pc = 0;
|
|
|
|
SyncTab tab;
|
|
SyncVar *golden[kRange] = {};
|
|
unsigned seed = 0;
|
|
for (uintptr_t i = 0; i < kIters; i++) {
|
|
uintptr_t addr = rand_r(&seed) % (kRange - 1) + 1;
|
|
if (rand_r(&seed) % 2) {
|
|
// Get or add.
|
|
SyncVar *v = tab.GetAndLock(thr, pc, addr, true);
|
|
EXPECT_TRUE(golden[addr] == 0 || golden[addr] == v);
|
|
EXPECT_EQ(v->addr, addr);
|
|
golden[addr] = v;
|
|
v->mtx.Unlock();
|
|
} else {
|
|
// Remove.
|
|
SyncVar *v = tab.GetAndRemove(thr, pc, addr);
|
|
EXPECT_EQ(golden[addr], v);
|
|
if (v) {
|
|
EXPECT_EQ(v->addr, addr);
|
|
golden[addr] = 0;
|
|
DestroyAndFree(v);
|
|
}
|
|
}
|
|
}
|
|
for (uintptr_t addr = 0; addr < kRange; addr++) {
|
|
if (golden[addr] == 0)
|
|
continue;
|
|
SyncVar *v = tab.GetAndRemove(thr, pc, addr);
|
|
EXPECT_EQ(v, golden[addr]);
|
|
EXPECT_EQ(v->addr, addr);
|
|
DestroyAndFree(v);
|
|
}
|
|
}
|
|
|
|
} // namespace __tsan
|