|
Alec Leamas |
5ed0b82 |
/*
|
|
Alec Leamas |
5ed0b82 |
Copyright 2005-2007 Adobe Systems Incorporated
|
|
Alec Leamas |
5ed0b82 |
Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt
|
|
Alec Leamas |
5ed0b82 |
or a copy at http://stlab.adobe.com/licenses.html)
|
|
Alec Leamas |
5ed0b82 |
*/
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
/*************************************************************************************************/
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#ifndef ADOBE_ONCE_HPP
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_ONCE_HPP
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
/*************************************************************************************************/
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#if defined(BOOST_HAS_THREADS)
|
|
Alec Leamas |
5ed0b82 |
#include <boost/thread.hpp>
|
|
Alec Leamas |
5ed0b82 |
#endif
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#include <adobe/config.hpp>
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
/*************************************************************************************************/
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
namespace adobe {
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
/*************************************************************************************************/
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#if defined(BOOST_HAS_THREADS)
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
/*************************************************************************************************/
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
typedef boost::once_flag once_flag;
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_ONCE_INIT BOOST_ONCE_INIT
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
inline void call_once(void (*func)(), adobe::once_flag& flag)
|
|
Alec Leamas |
5ed0b82 |
{
|
|
Alec Leamas |
5ed0b82 |
boost::call_once(func, flag);
|
|
Alec Leamas |
5ed0b82 |
}
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
/*************************************************************************************************/
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#else
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
/*************************************************************************************************/
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
typedef bool once_flag;
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_ONCE_INIT false
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
inline void call_once(void (*func)(), adobe::once_flag& flag)
|
|
Alec Leamas |
5ed0b82 |
{
|
|
Alec Leamas |
5ed0b82 |
if (!flag)
|
|
Alec Leamas |
5ed0b82 |
{
|
|
Alec Leamas |
5ed0b82 |
(*func)();
|
|
Alec Leamas |
5ed0b82 |
flag = true;
|
|
Alec Leamas |
5ed0b82 |
}
|
|
Alec Leamas |
5ed0b82 |
}
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
/*************************************************************************************************/
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#endif
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
/*************************************************************************************************/
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
} // namespace adobe
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
/*************************************************************************************************/
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_ONCE_DECLARATION(signature) \
|
|
Alec Leamas |
5ed0b82 |
struct adobe_initialize_constants_##signature##_t \
|
|
Alec Leamas |
5ed0b82 |
{ \
|
|
Alec Leamas |
5ed0b82 |
adobe_initialize_constants_##signature##_t(); \
|
|
Alec Leamas |
5ed0b82 |
};
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_ONCE_DEFINITION(signature, func) \
|
|
Alec Leamas |
5ed0b82 |
namespace { \
|
|
Alec Leamas |
5ed0b82 |
adobe::once_flag adobe_once_flag_##signature##_s = ADOBE_ONCE_INIT; \
|
|
Alec Leamas |
5ed0b82 |
} \
|
|
Alec Leamas |
5ed0b82 |
adobe_initialize_constants_##signature##_t::adobe_initialize_constants_##signature##_t() \
|
|
Alec Leamas |
5ed0b82 |
{ \
|
|
Alec Leamas |
5ed0b82 |
adobe::call_once(&func, adobe_once_flag_##signature##_s); \
|
|
Alec Leamas |
5ed0b82 |
}
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_ONCE_INSTANCE(signature) \
|
|
Alec Leamas |
5ed0b82 |
adobe_initialize_constants_##signature##_t adobe_initialize_constants_##signature##_s
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_ONCE_STATIC_INSTANCE(signature) \
|
|
Alec Leamas |
5ed0b82 |
namespace { ADOBE_ONCE_INSTANCE(signature); }
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#if defined(BOOST_HAS_THREADS)
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_GLOBAL_MUTEX_DEFINITION(signature) \
|
|
Alec Leamas |
5ed0b82 |
namespace { \
|
|
Alec Leamas |
5ed0b82 |
adobe::once_flag adobe_once_flag_##signature##_s = ADOBE_ONCE_INIT; \
|
|
Alec Leamas |
5ed0b82 |
boost::mutex* adobe_mutex_ptr_##signature##_s = 0; \
|
|
Alec Leamas |
5ed0b82 |
void adobe_init_once_##signature() \
|
|
Alec Leamas |
5ed0b82 |
{ \
|
|
Alec Leamas |
5ed0b82 |
static boost::mutex mutex_s; \
|
|
Alec Leamas |
5ed0b82 |
adobe_mutex_ptr_##signature##_s = &mutex_s; \
|
|
Alec Leamas |
5ed0b82 |
} \
|
|
Alec Leamas |
5ed0b82 |
}
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_GLOBAL_MUTEX_INSTANCE(signature) \
|
|
Alec Leamas |
5ed0b82 |
boost::call_once(&adobe_init_once_##signature, adobe_once_flag_##signature##_s); \
|
|
Alec Leamas |
5ed0b82 |
boost::mutex::scoped_lock lock(*adobe_mutex_ptr_##signature##_s)
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#else
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_GLOBAL_MUTEX_DEFINITION(signature)
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_GLOBAL_MUTEX_INSTANCE(signature)
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#endif
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
/*************************************************************************************************/
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#if defined(BOOST_HAS_THREADS)
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_THREAD_LOCAL_STORAGE_1(type, signature, ctor_p1) \
|
|
Alec Leamas |
5ed0b82 |
namespace { \
|
|
Alec Leamas |
5ed0b82 |
typedef boost::thread_specific_ptr< type > adobe_thread_local_storage_##signature##_t; \
|
|
Alec Leamas |
5ed0b82 |
adobe_thread_local_storage_##signature##_t* adobe_thread_local_storage_##signature##_g = 0;\
|
|
Alec Leamas |
5ed0b82 |
type& adobe_thread_local_storage_##signature##_access(); \
|
|
Alec Leamas |
5ed0b82 |
type& adobe_thread_local_storage_##signature##_access() \
|
|
Alec Leamas |
5ed0b82 |
{ \
|
|
Alec Leamas |
5ed0b82 |
type* result = adobe_thread_local_storage_##signature##_g->get(); \
|
|
Alec Leamas |
5ed0b82 |
if (result) return *result; \
|
|
Alec Leamas |
5ed0b82 |
result = new type(ctor_p1); \
|
|
Alec Leamas |
5ed0b82 |
adobe_thread_local_storage_##signature##_g->reset(result); \
|
|
Alec Leamas |
5ed0b82 |
return *result; \
|
|
Alec Leamas |
5ed0b82 |
} }
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_THREAD_LOCAL_STORAGE(type, signature) \
|
|
Alec Leamas |
5ed0b82 |
namespace { \
|
|
Alec Leamas |
5ed0b82 |
typedef boost::thread_specific_ptr< type > adobe_thread_local_storage_##signature##_t; \
|
|
Alec Leamas |
5ed0b82 |
adobe_thread_local_storage_##signature##_t* adobe_thread_local_storage_##signature##_g = 0;\
|
|
Alec Leamas |
5ed0b82 |
type& adobe_thread_local_storage_##signature##_access(); \
|
|
Alec Leamas |
5ed0b82 |
type& adobe_thread_local_storage_##signature##_access() \
|
|
Alec Leamas |
5ed0b82 |
{ \
|
|
Alec Leamas |
5ed0b82 |
type* result = adobe_thread_local_storage_##signature##_g->get(); \
|
|
Alec Leamas |
5ed0b82 |
if (result) return *result; \
|
|
Alec Leamas |
5ed0b82 |
result = new type(); \
|
|
Alec Leamas |
5ed0b82 |
adobe_thread_local_storage_##signature##_g->reset(result); \
|
|
Alec Leamas |
5ed0b82 |
return *result; \
|
|
Alec Leamas |
5ed0b82 |
} }
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_THREAD_LOCAL_STORAGE_INITIALIZE(signature) \
|
|
Alec Leamas |
5ed0b82 |
static adobe_thread_local_storage_##signature##_t adobe_thread_local_storage_##signature##_s; \
|
|
Alec Leamas |
5ed0b82 |
adobe_thread_local_storage_##signature##_g = &adobe_thread_local_storage_##signature##_s
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#else
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_THREAD_LOCAL_STORAGE_1(type, signature, ctor_p1) \
|
|
Alec Leamas |
5ed0b82 |
type& adobe_thread_local_storage_##signature##_access(); \
|
|
Alec Leamas |
5ed0b82 |
type& adobe_thread_local_storage_##signature##_access() \
|
|
Alec Leamas |
5ed0b82 |
{ \
|
|
Alec Leamas |
5ed0b82 |
static type adobe_thread_local_storage_##signature##_s(ctor_p1); \
|
|
Alec Leamas |
5ed0b82 |
return adobe_thread_local_storage_##signature##_s; \
|
|
Alec Leamas |
5ed0b82 |
}
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_THREAD_LOCAL_STORAGE(type, signature) \
|
|
Alec Leamas |
5ed0b82 |
type& adobe_thread_local_storage_##signature##_access(); \
|
|
Alec Leamas |
5ed0b82 |
type& adobe_thread_local_storage_##signature##_access() \
|
|
Alec Leamas |
5ed0b82 |
{ \
|
|
Alec Leamas |
5ed0b82 |
static type adobe_thread_local_storage_##signature##_s; \
|
|
Alec Leamas |
5ed0b82 |
return adobe_thread_local_storage_##signature##_s; \
|
|
Alec Leamas |
5ed0b82 |
}
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_THREAD_LOCAL_STORAGE_INITIALIZE(signature)
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#endif
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#define ADOBE_THREAD_LOCAL_STORAGE_ACCESS(signature) \
|
|
Alec Leamas |
5ed0b82 |
adobe_thread_local_storage_##signature##_access()
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
/*************************************************************************************************/
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
#endif // ADOBE_ONCE_HPP
|
|
Alec Leamas |
5ed0b82 |
|
|
Alec Leamas |
5ed0b82 |
/*************************************************************************************************/
|