X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=gdax-orderbook-hpp%2Fdemo%2Fdependencies%2Flibcds-2.3.2%2Fcds%2Fthreading%2Fdetails%2Fgcc_manager.h;fp=gdax-orderbook-hpp%2Fdemo%2Fdependencies%2Flibcds-2.3.2%2Fcds%2Fthreading%2Fdetails%2Fgcc_manager.h;h=a7e5afd50446330f22b4ca9bf2de18f1e08d1172;hb=4223430d9168223029c7639149025c79e69b4f37;hp=0000000000000000000000000000000000000000;hpb=7ea7751a31c0388bf888052517be181a2989b113;p=c11concurrency-benchmarks.git diff --git a/gdax-orderbook-hpp/demo/dependencies/libcds-2.3.2/cds/threading/details/gcc_manager.h b/gdax-orderbook-hpp/demo/dependencies/libcds-2.3.2/cds/threading/details/gcc_manager.h new file mode 100644 index 0000000..a7e5afd --- /dev/null +++ b/gdax-orderbook-hpp/demo/dependencies/libcds-2.3.2/cds/threading/details/gcc_manager.h @@ -0,0 +1,139 @@ +/* + This file is a part of libcds - Concurrent Data Structures library + + (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017 + + Source code repo: http://github.com/khizmax/libcds/ + Download: http://sourceforge.net/projects/libcds/files/ + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef CDSLIB_THREADING_DETAILS_GCC_MANAGER_H +#define CDSLIB_THREADING_DETAILS_GCC_MANAGER_H + +#if !( CDS_COMPILER == CDS_COMPILER_GCC || CDS_COMPILER == CDS_COMPILER_CLANG || CDS_COMPILER == CDS_COMPILER_INTEL) +# error "threading/details/gcc_manager.h may be used only with GCC or Clang C++ compiler" +#endif + +#include + +//@cond +namespace cds { namespace threading { + + //@cond + struct gcc_internal { + typedef unsigned char ThreadDataPlaceholder[ sizeof(ThreadData) ]; + static __thread ThreadDataPlaceholder CDS_DATA_ALIGNMENT(8) s_threadData; + static __thread ThreadData * s_pThreadData; + }; + //@endcond + + /// cds::threading::Manager implementation based on GCC __thread declaration + inline namespace gcc { + + /// Thread-specific data manager based on GCC __thread feature + class Manager { + private : + //@cond + + static ThreadData * _threadData() + { + return gcc_internal::s_pThreadData; + } + + static ThreadData * create_thread_data() + { + if ( !gcc_internal::s_pThreadData ) { + gcc_internal::s_pThreadData = new (gcc_internal::s_threadData) ThreadData(); + } + return gcc_internal::s_pThreadData; + } + + static void destroy_thread_data() + { + if ( gcc_internal::s_pThreadData ) { + ThreadData * p = gcc_internal::s_pThreadData; + gcc_internal::s_pThreadData = nullptr; + p->ThreadData::~ThreadData(); + } + } + //@endcond + + public: + /// Initialize manager (empty function) + /** + This function is automatically called by cds::Initialize + */ + static void init() + {} + + /// Terminate manager (empty function) + /** + This function is automatically called by cds::Terminate + */ + static void fini() + {} + + /// Checks whether current thread is attached to \p libcds feature or not. + static bool isThreadAttached() + { + return _threadData() != nullptr; + } + + /// This method must be called in beginning of thread execution + static void attachThread() + { + create_thread_data()->init(); + } + + /// This method must be called in end of thread execution + static void detachThread() + { + assert( _threadData()); + + if ( _threadData()->fini()) + destroy_thread_data(); + } + + /// Returns ThreadData pointer for the current thread + static ThreadData * thread_data() + { + ThreadData * p = _threadData(); + assert( p ); + return p; + } + + //@cond + static size_t fake_current_processor() + { + return _threadData()->fake_current_processor(); + } + //@endcond + }; + + } // namespace gcc + +}} // namespace cds::threading +//@endcond + +#endif // #ifndef CDSLIB_THREADING_DETAILS_GCC_MANAGER_H