X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8b73c5318ccc837aff38c0e5a824bc4fd56c75c8..83a7613b7186bb2597a393b6bcb14166f1e0641d:/include/wx/tls.h?ds=inline diff --git a/include/wx/tls.h b/include/wx/tls.h index 1902716068..bd4e9bad7a 100644 --- a/include/wx/tls.h +++ b/include/wx/tls.h @@ -44,8 +44,16 @@ #define wxTLS_PTR(var) (&(var)) #define wxTLS_VALUE(var) (var) #else // !wxHAS_COMPILER_TLS - #ifdef __WXMSW__ + + extern "C" + { + typedef void (*wxTlsDestructorFunction)(void*); + } + + #if defined(__WXMSW__) #include "wx/msw/tls.h" + #elif defined(__OS2__) + #include "wx/os2/tls.h" #elif defined(__UNIX__) #include "wx/unix/tls.h" #else @@ -58,6 +66,14 @@ // wxTlsValue represents a thread-specific value of type T but, unlike // with native compiler thread-specific variables, it behaves like a // (never NULL) pointer to T and so needs to be dereferenced before use + // + // Note: T must be a POD! + // + // Note: On Unix, thread-specific T value is freed when the thread exits. + // On Windows, thread-specific values are freed later, when given + // wxTlsValue is destroyed. The only exception to this is the + // value for the main thread, which is always freed when + // wxTlsValue is destroyed. template class wxTlsValue { @@ -65,32 +81,17 @@ typedef T ValueType; // ctor doesn't do anything, the object is created on first access - // - // FIXME: the thread-specific values are currently not freed under - // Windows, resulting in memory leaks, this must be implemented - // there somehow (probably by keeping a list of all TLS objects - // and cleaning them up in wxThread cleanup) - wxTlsValue() -#ifdef __UNIX__ - : m_key(free) -#endif - { - } + wxTlsValue() : m_key(free) {} // dtor is only called in the main thread context and so is not enough // to free memory allocated by us for the other threads, we use // destructor function when using Pthreads for this (which is not // called for the main thread as it doesn't call pthread_exit() but - // just to be safe we also reset the key anyhow) and simply leak the - // memory under Windows (see the FIXME above) + // just to be safe we also reset the key anyhow) ~wxTlsValue() { - void * const value = m_key.Get(); - if ( value) - { - free(value); - m_key.Set(NULL); - } + if ( m_key.Get() ) + m_key.Set(NULL); // this deletes the value } // access the object creating it on demand