summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/sanitizer_addrhashmap.h
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2014-05-13 08:36:31 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2014-05-13 08:36:31 +0000
commitcad7f30c4a24a2aaa81fac9e986d34bd6316b295 (patch)
tree5d3959a86918f49ba72b19ebdc0ead68922c02f3 /lib/sanitizer_common/sanitizer_addrhashmap.h
parent50926f626de44bf11819b86e0f39240159c1e66d (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.h35
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;
}