Skip to content
Snippets Groups Projects
stdthread.hh 2.03 KiB
Newer Older
  • Learn to ignore specific revisions
  • // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    // vi: set et ts=4 sw=2 sts=2:
    
    #ifndef DUNE_COMMON_STDTHREAD_HH
    #define DUNE_COMMON_STDTHREAD_HH
    
    
    #include <dune/common/nullptr.hh>
    
    #include <dune/common/unused.hh>
    
    namespace Dune
    {
    
      // used internally by assertCallOnce for the actual check
      void doAssertCallOnce(const char *file, int line, const char *function);
    
      //! \brief Make sure call_once() works and provide a helpful error message
      //!        otherwise.
      /**
       * For call_once() to work, certain versions of libstdc++ need to be
       * _linked_ with -pthread or similar flags.  If that is not the case,
       * call_once() will throw an exception.  This function checks that
       * call_once() can indeed be used, i.e. that it does not throw an exception
       * when it should not, and that the code does indeed get executed.  If
       * call_once() cannot be used, assertCallOnce() aborts the program with a
       * helpful error message.
       *
       * The check is only actually executed the first time assertCallOnce() is
       * called.
       *
       * The arguments \c file and \c line specify the filename and line number
       * that should appear in the error message.  They are ignored if \c file is
       * 0.  The argument \c function specifies the name of the function to appear
       * in the error message.  It is ignored if \c function is 0.
       */
    
      inline void assertCallOnce(const char *file = nullptr, int line = -1,
                                 const char *function = nullptr)
      {
        // make sure to call this only the first time this function is invoked
        static const bool DUNE_UNUSED works
          = (doAssertCallOnce(file, line, function), true);
      }
    
      //! \brief Make sure call_once() works and provide a helpful error message
      //!        otherwise.
      /**
       * This calls assertCallOnce() and automatically provides information about
       * the caller in the error message.
       */
    #define DUNE_ASSERT_CALL_ONCE()                         \
      ::Dune::assertCallOnce(__FILE__, __LINE__, __func__)
    
    } // namespace Dune
    
    #endif // DUNE_COMMON_STDTHREAD_HH