003 File Manager
Current Path:
/usr/src/contrib/llvm-project/compiler-rt/lib/scudo/standalone
usr
/
src
/
contrib
/
llvm-project
/
compiler-rt
/
lib
/
scudo
/
standalone
/
📁
..
📄
allocator_config.h
(2.57 KB)
📄
atomic_helpers.h
(4.16 KB)
📄
bytemap.h
(992 B)
📄
checksum.cpp
(2.52 KB)
📄
checksum.h
(1.67 KB)
📄
chunk.h
(5.83 KB)
📄
combined.h
(40.99 KB)
📄
common.cpp
(874 B)
📄
common.h
(5.29 KB)
📄
crc32_hw.cpp
(656 B)
📄
flags.cpp
(2.09 KB)
📄
flags.h
(975 B)
📄
flags.inc
(2.41 KB)
📄
flags_parser.cpp
(4.38 KB)
📄
flags_parser.h
(1.23 KB)
📄
fuchsia.cpp
(6.04 KB)
📄
fuchsia.h
(695 B)
📁
fuzz
📁
include
📄
internal_defs.h
(4.61 KB)
📄
linux.cpp
(6.1 KB)
📄
linux.h
(2.77 KB)
📄
list.h
(4.95 KB)
📄
local_cache.h
(5.21 KB)
📄
memtag.h
(7.21 KB)
📄
mutex.h
(1.69 KB)
📄
platform.h
(2.03 KB)
📄
primary32.h
(18.05 KB)
📄
primary64.h
(17.3 KB)
📄
quarantine.h
(9.64 KB)
📄
release.cpp
(522 B)
📄
release.h
(10.27 KB)
📄
report.cpp
(6.62 KB)
📄
report.h
(1.97 KB)
📄
secondary.h
(13.22 KB)
📄
size_class_map.h
(9.9 KB)
📄
stack_depot.h
(4.47 KB)
📄
stats.h
(2.77 KB)
📄
string_utils.cpp
(7.93 KB)
📄
string_utils.h
(1.05 KB)
📄
tsd.h
(1.84 KB)
📄
tsd_exclusive.h
(4.03 KB)
📄
tsd_shared.h
(5.53 KB)
📄
vector.h
(3.07 KB)
📄
wrappers_c.cpp
(1.19 KB)
📄
wrappers_c.h
(1.46 KB)
📄
wrappers_c.inc
(8.6 KB)
📄
wrappers_c_bionic.cpp
(2.23 KB)
📄
wrappers_c_checks.h
(1.99 KB)
📄
wrappers_cpp.cpp
(4.53 KB)
Editing: list.h
//===-- list.h --------------------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef SCUDO_LIST_H_ #define SCUDO_LIST_H_ #include "internal_defs.h" namespace scudo { // Intrusive POD singly and doubly linked list. // An object with all zero fields should represent a valid empty list. clear() // should be called on all non-zero-initialized objects before using. template <class T> class IteratorBase { public: explicit IteratorBase(T *CurrentT) : Current(CurrentT) {} IteratorBase &operator++() { Current = Current->Next; return *this; } bool operator!=(IteratorBase Other) const { return Current != Other.Current; } T &operator*() { return *Current; } private: T *Current; }; template <class T> struct IntrusiveList { bool empty() const { return Size == 0; } uptr size() const { return Size; } T *front() { return First; } const T *front() const { return First; } T *back() { return Last; } const T *back() const { return Last; } void clear() { First = Last = nullptr; Size = 0; } typedef IteratorBase<T> Iterator; typedef IteratorBase<const T> ConstIterator; Iterator begin() { return Iterator(First); } Iterator end() { return Iterator(nullptr); } ConstIterator begin() const { return ConstIterator(First); } ConstIterator end() const { return ConstIterator(nullptr); } void checkConsistency() const; protected: uptr Size; T *First; T *Last; }; template <class T> void IntrusiveList<T>::checkConsistency() const { if (Size == 0) { CHECK_EQ(First, nullptr); CHECK_EQ(Last, nullptr); } else { uptr Count = 0; for (T *I = First;; I = I->Next) { Count++; if (I == Last) break; } CHECK_EQ(this->size(), Count); CHECK_EQ(Last->Next, nullptr); } } template <class T> struct SinglyLinkedList : public IntrusiveList<T> { using IntrusiveList<T>::First; using IntrusiveList<T>::Last; using IntrusiveList<T>::Size; using IntrusiveList<T>::empty; void push_back(T *X) { X->Next = nullptr; if (empty()) First = X; else Last->Next = X; Last = X; Size++; } void push_front(T *X) { if (empty()) Last = X; X->Next = First; First = X; Size++; } void pop_front() { DCHECK(!empty()); First = First->Next; if (!First) Last = nullptr; Size--; } void extract(T *Prev, T *X) { DCHECK(!empty()); DCHECK_NE(Prev, nullptr); DCHECK_NE(X, nullptr); DCHECK_EQ(Prev->Next, X); Prev->Next = X->Next; if (Last == X) Last = Prev; Size--; } void append_back(SinglyLinkedList<T> *L) { DCHECK_NE(this, L); if (L->empty()) return; if (empty()) { *this = *L; } else { Last->Next = L->First; Last = L->Last; Size += L->size(); } L->clear(); } }; template <class T> struct DoublyLinkedList : IntrusiveList<T> { using IntrusiveList<T>::First; using IntrusiveList<T>::Last; using IntrusiveList<T>::Size; using IntrusiveList<T>::empty; void push_front(T *X) { X->Prev = nullptr; if (empty()) { Last = X; } else { DCHECK_EQ(First->Prev, nullptr); First->Prev = X; } X->Next = First; First = X; Size++; } // Inserts X before Y. void insert(T *X, T *Y) { if (Y == First) return push_front(X); T *Prev = Y->Prev; // This is a hard CHECK to ensure consistency in the event of an intentional // corruption of Y->Prev, to prevent a potential write-{4,8}. CHECK_EQ(Prev->Next, Y); Prev->Next = X; X->Prev = Prev; X->Next = Y; Y->Prev = X; Size++; } void push_back(T *X) { X->Next = nullptr; if (empty()) { First = X; } else { DCHECK_EQ(Last->Next, nullptr); Last->Next = X; } X->Prev = Last; Last = X; Size++; } void pop_front() { DCHECK(!empty()); First = First->Next; if (!First) Last = nullptr; else First->Prev = nullptr; Size--; } // The consistency of the adjacent links is aggressively checked in order to // catch potential corruption attempts, that could yield a mirrored // write-{4,8} primitive. nullptr checks are deemed less vital. void remove(T *X) { T *Prev = X->Prev; T *Next = X->Next; if (Prev) { CHECK_EQ(Prev->Next, X); Prev->Next = Next; } if (Next) { CHECK_EQ(Next->Prev, X); Next->Prev = Prev; } if (First == X) { DCHECK_EQ(Prev, nullptr); First = Next; } else { DCHECK_NE(Prev, nullptr); } if (Last == X) { DCHECK_EQ(Next, nullptr); Last = Prev; } else { DCHECK_NE(Next, nullptr); } Size--; } }; } // namespace scudo #endif // SCUDO_LIST_H_
Upload File
Create Folder