X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/49f11e84829d4045fdaea5b5986994f87c1d27c0..3c01c5951189e13b8b4a5d7b288b54d4a57a30f8:/tests/benchmarks/tls.cpp diff --git a/tests/benchmarks/tls.cpp b/tests/benchmarks/tls.cpp index afccef5377..b187566c17 100644 --- a/tests/benchmarks/tls.cpp +++ b/tests/benchmarks/tls.cpp @@ -10,14 +10,22 @@ #include "bench.h" -#ifdef __UNIX__ +#include "wx/tls.h" + +#if defined(__UNIX__) #define HAVE_PTHREAD #include +#elif defined(__WIN32__) + #define HAVE_WIN32_THREAD + #include "wx/msw/wrapwin.h" #endif #if wxCHECK_GCC_VERSION(3, 3) #define HAVE_COMPILER_THREAD #define wxTHREAD_SPECIFIC __thread +#elif wxCHECK_VISUALC_VERSION(7) + #define HAVE_COMPILER_THREAD + #define wxTHREAD_SPECIFIC __declspec(thread) #endif // uncomment this to also test Boost version (you will also need to link with @@ -105,6 +113,46 @@ BENCHMARK_FUNC(PosixTLS) #endif // HAVE_PTHREAD +#ifdef HAVE_WIN32_THREAD + +class TlsSlot +{ +public: + TlsSlot() + { + m_slot = ::TlsAlloc(); + } + + ~TlsSlot() + { + ::TlsFree(m_slot); + } + + operator DWORD() const { return m_slot; } + +private: + DWORD m_slot; + + DECLARE_NO_COPY_CLASS(TlsSlot) +}; + +BENCHMARK_FUNC(Win32TLS) +{ + static TlsSlot s_slot; + + for ( int n = 0; n < NUM_ITER; n++ ) + { + if ( n % 2 ) + ::TlsSetValue(s_slot, 0); + else + ::TlsSetValue(s_slot, &n); + } + + return !::TlsGetValue(s_slot); +} + +#endif // HAVE_WIN32_THREAD + #ifdef HAVE_BOOST_THREAD BENCHMARK_FUNC(BoostTLS) @@ -125,3 +173,19 @@ BENCHMARK_FUNC(BoostTLS) } #endif // HAVE_BOOST_THREAD + +BENCHMARK_FUNC(wxTLS) +{ + static wxTLS_TYPE(int) s_globalVar; + #define s_global wxTLS_VALUE(s_globalVar) + + for ( int n = 0; n < NUM_ITER; n++ ) + { + if ( n % 2 ) + s_global = 0; + else + s_global = n; + } + + return !s_global; +}