]>
git.proxmox.com Git - rustc.git/blob - src/libcompiler_builtins/compiler-rt/lib/tsan/rtl/tsan_mutexset.cc
1 //===-- tsan_mutexset.cc --------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file is a part of ThreadSanitizer (TSan), a race detector.
12 //===----------------------------------------------------------------------===//
13 #include "tsan_mutexset.h"
18 const uptr
MutexSet::kMaxSize
;
20 MutexSet::MutexSet() {
22 internal_memset(&descs_
, 0, sizeof(descs_
));
25 void MutexSet::Add(u64 id
, bool write
, u64 epoch
) {
26 // Look up existing mutex with the same id.
27 for (uptr i
= 0; i
< size_
; i
++) {
28 if (descs_
[i
].id
== id
) {
30 descs_
[i
].epoch
= epoch
;
34 // On overflow, find the oldest mutex and drop it.
35 if (size_
== kMaxSize
) {
36 u64 minepoch
= (u64
)-1;
38 for (uptr i
= 0; i
< size_
; i
++) {
39 if (descs_
[i
].epoch
< minepoch
) {
40 minepoch
= descs_
[i
].epoch
;
45 CHECK_EQ(size_
, kMaxSize
- 1);
47 // Add new mutex descriptor.
48 descs_
[size_
].id
= id
;
49 descs_
[size_
].write
= write
;
50 descs_
[size_
].epoch
= epoch
;
51 descs_
[size_
].count
= 1;
55 void MutexSet::Del(u64 id
, bool write
) {
56 for (uptr i
= 0; i
< size_
; i
++) {
57 if (descs_
[i
].id
== id
) {
58 if (--descs_
[i
].count
== 0)
65 void MutexSet::Remove(u64 id
) {
66 for (uptr i
= 0; i
< size_
; i
++) {
67 if (descs_
[i
].id
== id
) {
74 void MutexSet::RemovePos(uptr i
) {
76 descs_
[i
] = descs_
[size_
- 1];
80 uptr
MutexSet::Size() const {
84 MutexSet::Desc
MutexSet::Get(uptr i
) const {