diff options
author | Thiago Marcos P. Santos <tmpsantos@gmail.com> | 2017-07-13 16:38:42 +0300 |
---|---|---|
committer | Thiago Marcos P. Santos <tmpsantos@gmail.com> | 2017-07-14 15:18:54 +0300 |
commit | 48ddfef89ff4daa2e26d3338dbfc20c4f4cc7d21 (patch) | |
tree | dfe3e3518719411f97dc441fb14f4ddfc5af47fd /platform | |
parent | 3b26177e9d3d9ed87f96ac33e7ed74bc7653f661 (diff) | |
download | qtlocation-mapboxgl-48ddfef89ff4daa2e26d3338dbfc20c4f4cc7d21.tar.gz |
[core] Make sure ThreadLocal will not own the pointer it is managing
ThreadLocal should not own the pointer it is managing because
the use case in Mapbox GL is to keep a pointer to a stack allocated
object, like:
```
MyObject foo;
threadLocal.set(&foo);
```
To keep consistency, it is required that we clear the managed
object before ThreadLocal gets destroyed by setting it to `nullptr`.
Diffstat (limited to 'platform')
-rw-r--r-- | platform/default/thread_local.cpp | 6 | ||||
-rw-r--r-- | platform/qt/src/thread_local.cpp | 7 |
2 files changed, 11 insertions, 2 deletions
diff --git a/platform/default/thread_local.cpp b/platform/default/thread_local.cpp index b754a04b7d..6fdb1e6dc1 100644 --- a/platform/default/thread_local.cpp +++ b/platform/default/thread_local.cpp @@ -29,7 +29,11 @@ ThreadLocal<T>::ThreadLocal() : impl(std::make_unique<Impl>()) { template <class T> ThreadLocal<T>::~ThreadLocal() { - delete get(); + // ThreadLocal will not take ownership + // of the pointer it is managing. The pointer + // needs to be explicitly cleared before we + // destroy this object. + assert(!get()); if (pthread_key_delete(impl->key)) { Log::Error(Event::General, "Failed to delete local storage key."); diff --git a/platform/qt/src/thread_local.cpp b/platform/qt/src/thread_local.cpp index e48a9d6e74..e835a680e2 100644 --- a/platform/qt/src/thread_local.cpp +++ b/platform/qt/src/thread_local.cpp @@ -4,6 +4,7 @@ #include <mbgl/map/backend_scope.hpp> #include <array> +#include <cassert> #include <QThreadStorage> @@ -23,7 +24,11 @@ ThreadLocal<T>::ThreadLocal() : impl(std::make_unique<Impl>()) { template <class T> ThreadLocal<T>::~ThreadLocal() { - delete get(); + // ThreadLocal will not take ownership + // of the pointer it is managing. The pointer + // needs to be explicitly cleared before we + // destroy this object. + assert(!get()); } template <class T> |