From 48ddfef89ff4daa2e26d3338dbfc20c4f4cc7d21 Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Thu, 13 Jul 2017 16:38:42 +0300 Subject: [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`. --- platform/default/thread_local.cpp | 6 +++++- platform/qt/src/thread_local.cpp | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) (limited to 'platform') 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::ThreadLocal() : impl(std::make_unique()) { template ThreadLocal::~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 #include +#include #include @@ -23,7 +24,11 @@ ThreadLocal::ThreadLocal() : impl(std::make_unique()) { template ThreadLocal::~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 -- cgit v1.2.1