diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-05-13 08:36:31 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-05-13 08:36:31 +0000 |
commit | cad7f30c4a24a2aaa81fac9e986d34bd6316b295 (patch) | |
tree | 5d3959a86918f49ba72b19ebdc0ead68922c02f3 /lib/sanitizer_common/sanitizer_addrhashmap.h | |
parent | 50926f626de44bf11819b86e0f39240159c1e66d (diff) |
[msan] Better open_memstream support.
Move fflush and fclose interceptors to sanitizer_common.
Use a metadata map to keep information about the external locations
that must be updated when the file is written to.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@208676 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_addrhashmap.h')
-rw-r--r-- | lib/sanitizer_common/sanitizer_addrhashmap.h | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/lib/sanitizer_common/sanitizer_addrhashmap.h b/lib/sanitizer_common/sanitizer_addrhashmap.h index c50fb1e33..e09192643 100644 --- a/lib/sanitizer_common/sanitizer_addrhashmap.h +++ b/lib/sanitizer_common/sanitizer_addrhashmap.h @@ -17,6 +17,7 @@ #include "sanitizer_common.h" #include "sanitizer_mutex.h" #include "sanitizer_atomic.h" +#include "sanitizer_allocator_internal.h" namespace __sanitizer { @@ -66,9 +67,12 @@ class AddrHashMap { class Handle { public: - Handle(AddrHashMap<T, kSize> *map, uptr addr, bool remove = false); + Handle(AddrHashMap<T, kSize> *map, uptr addr); + Handle(AddrHashMap<T, kSize> *map, uptr addr, bool remove); + Handle(AddrHashMap<T, kSize> *map, uptr addr, bool remove, bool create); + ~Handle(); - T *operator -> (); + T *operator->(); bool created() const; bool exists() const; @@ -81,6 +85,7 @@ class AddrHashMap { uptr addidx_; bool created_; bool remove_; + bool create_; }; private: @@ -93,11 +98,31 @@ class AddrHashMap { }; template<typename T, uptr kSize> +AddrHashMap<T, kSize>::Handle::Handle(AddrHashMap<T, kSize> *map, uptr addr) { + map_ = map; + addr_ = addr; + remove_ = false; + create_ = true; + map_->acquire(this); +} + +template<typename T, uptr kSize> AddrHashMap<T, kSize>::Handle::Handle(AddrHashMap<T, kSize> *map, uptr addr, bool remove) { map_ = map; addr_ = addr; remove_ = remove; + create_ = true; + map_->acquire(this); +} + +template<typename T, uptr kSize> +AddrHashMap<T, kSize>::Handle::Handle(AddrHashMap<T, kSize> *map, uptr addr, + bool remove, bool create) { + map_ = map; + addr_ = addr; + remove_ = remove; + create_ = create; map_->acquire(this); } @@ -106,8 +131,8 @@ AddrHashMap<T, kSize>::Handle::~Handle() { map_->release(this); } -template<typename T, uptr kSize> -T *AddrHashMap<T, kSize>::Handle::operator -> () { +template <typename T, uptr kSize> +T *AddrHashMap<T, kSize>::Handle::operator->() { return &cell_->val; } @@ -207,7 +232,7 @@ void AddrHashMap<T, kSize>::acquire(Handle *h) { } // The element does not exist, no need to create it if we want to remove. - if (h->remove_) { + if (h->remove_ || !h->create_) { b->mtx.Unlock(); return; } |