12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines//===-- tsan_ignoreset.cc -------------------------------------------------===//
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines//
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines//                     The LLVM Compiler Infrastructure
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines//
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// This file is distributed under the University of Illinois Open Source
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// License. See LICENSE.TXT for details.
72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines//
82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines//===----------------------------------------------------------------------===//
92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines//
102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// This file is a part of ThreadSanitizer (TSan), a race detector.
112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines//
122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines//===----------------------------------------------------------------------===//
132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "tsan_ignoreset.h"
142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesnamespace __tsan {
162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesconst uptr IgnoreSet::kMaxSize;
182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesIgnoreSet::IgnoreSet()
202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    : size_() {
212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid IgnoreSet::Add(u32 stack_id) {
242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (size_ == kMaxSize)
252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    return;
262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  for (uptr i = 0; i < size_; i++) {
272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    if (stacks_[i] == stack_id)
282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      return;
292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  stacks_[size_++] = stack_id;
312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid IgnoreSet::Reset() {
342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  size_ = 0;
352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesuptr IgnoreSet::Size() const {
382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return size_;
392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesu32 IgnoreSet::At(uptr i) const {
422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  CHECK_LT(i, size_);
432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  CHECK_LE(size_, kMaxSize);
442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return stacks_[i];
452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}  // namespace __tsan
48