12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- //===-- sanitizer_stackdepot.h ----------------------------------*- C++ -*-===//
- //
- // This file is distributed under the University of Illinois Open Source
- // License. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- //
- // This file is shared between AddressSanitizer and ThreadSanitizer
- // run-time libraries.
- //===----------------------------------------------------------------------===//
- #ifndef SANITIZER_STACKDEPOT_H
- #define SANITIZER_STACKDEPOT_H
- #include "sanitizer_common.h"
- #include "sanitizer_internal_defs.h"
- #include "sanitizer_stacktrace.h"
- namespace __sanitizer {
- // StackDepot efficiently stores huge amounts of stack traces.
- struct StackDepotNode;
- struct StackDepotHandle {
- StackDepotNode *node_;
- StackDepotHandle() : node_(0) {}
- explicit StackDepotHandle(StackDepotNode *node) : node_(node) {}
- bool valid() { return node_; }
- u32 id();
- int use_count();
- void inc_use_count_unsafe();
- };
- const int kStackDepotMaxUseCount = 1U << 20;
- StackDepotStats *StackDepotGetStats();
- u32 StackDepotPut(StackTrace stack);
- StackDepotHandle StackDepotPut_WithHandle(StackTrace stack);
- // Retrieves a stored stack trace by the id.
- StackTrace StackDepotGet(u32 id);
- void StackDepotLockAll();
- void StackDepotUnlockAll();
- // Instantiating this class creates a snapshot of StackDepot which can be
- // efficiently queried with StackDepotGet(). You can use it concurrently with
- // StackDepot, but the snapshot is only guaranteed to contain those stack traces
- // which were stored before it was instantiated.
- class StackDepotReverseMap {
- public:
- StackDepotReverseMap();
- StackTrace Get(u32 id);
- private:
- struct IdDescPair {
- u32 id;
- StackDepotNode *desc;
- static bool IdComparator(const IdDescPair &a, const IdDescPair &b);
- };
- InternalMmapVector<IdDescPair> map_;
- // Disallow evil constructors.
- StackDepotReverseMap(const StackDepotReverseMap&);
- void operator=(const StackDepotReverseMap&);
- };
- } // namespace __sanitizer
- #endif // SANITIZER_STACKDEPOT_H
|