// Purpose: Pthreads implementation of wxTlsValue<>
// Author: Vadim Zeitlin
// Created: 2008-08-08
-// RCS-ID: $Id$
// Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_UNIX_TLS_H_
#define _WX_UNIX_TLS_H_
-#include "wx/intl.h"
-#include "wx/log.h"
-
#include <pthread.h>
// ----------------------------------------------------------------------------
class wxTlsKey
{
public:
- // ctor allocates a new key
- wxTlsKey()
+ // ctor allocates a new key and possibly registering a destructor function
+ // for it
+ wxTlsKey(wxTlsDestructorFunction destructor)
{
- int rc = pthread_key_create(&m_key, NULL);
- if ( rc )
- wxLogSysError(_("Creating TLS key failed"), rc);
+ m_destructor = destructor;
+ if ( pthread_key_create(&m_key, destructor) != 0 )
+ m_key = 0;
}
// return true if the key was successfully allocated
// change the key value, return true if ok
bool Set(void *value)
{
- int rc = pthread_setspecific(m_key, value);
- if ( rc )
- {
- wxLogSysError(_("Failed to set TLS value"));
- return false;
- }
+ void *old = Get();
+ if ( old )
+ m_destructor(old);
- return true;
+ return pthread_setspecific(m_key, value) == 0;
}
// free the key
}
private:
+ wxTlsDestructorFunction m_destructor;
pthread_key_t m_key;
- DECLARE_NO_COPY_CLASS(wxTlsKey)
+ wxDECLARE_NO_COPY_CLASS(wxTlsKey);
};
#endif // _WX_UNIX_TLS_H_