Blame tmp/source_release/adobe/once.hpp

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
/*************************************************************************************************/