Revert "Add workaround for chaiscript used as static"

This reverts commit a281d9571e00788784a10bdae054f92cb3e3fb1a.
This commit is contained in:
Jason Turner 2017-05-31 13:54:45 -06:00
parent bd736eddec
commit 3b48983bc2

View File

@ -75,19 +75,17 @@ namespace chaiscript
~Thread_Storage() ~Thread_Storage()
{ {
if (!destroyed) { t().erase(this);
t().erase(this);
}
} }
inline const T *operator->() const inline const T *operator->() const
{ {
return &(t()[const_cast<Thread_Storage *>(this)]); return &(t()[this]);
} }
inline const T &operator*() const inline const T &operator*() const
{ {
return t()[const_cast<Thread_Storage *>(this)]; return t()[this];
} }
inline T *operator->() inline T *operator->()
@ -100,30 +98,15 @@ namespace chaiscript
return t()[this]; return t()[this];
} }
void *m_key;
private: private:
struct Map_Holder { static std::unordered_map<const void*, T> &t()
std::unordered_map<Thread_Storage<T> *, T> map;
Map_Holder() = default;
Map_Holder(const Map_Holder &) = delete;
Map_Holder(Map_Holder &&) = delete;
Map_Holder& operator=(Map_Holder &&) = delete;
Map_Holder& operator=(const Map_Holder &&) = delete;
~Map_Holder() {
// here is the theory:
// * If the Map_Holder is destroyed before the Thread_Storage, a flag will get set
// * If destroyed after the Thread_Storage, the * will have been removed from `map` and nothing will happen
for(auto &elem : map) { elem.first->destroyed = true; }
}
};
static std::unordered_map<Thread_Storage<T> *, T> &t()
{ {
thread_local Map_Holder my_map; thread_local std::unordered_map<const void *, T> my_t;
return my_map.map; return my_t;
} }
bool destroyed{false};
}; };
#else // threading disabled #else // threading disabled