diff options
Diffstat (limited to 'boost/log/sinks/unlocked_frontend.hpp')
-rw-r--r-- | boost/log/sinks/unlocked_frontend.hpp | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/boost/log/sinks/unlocked_frontend.hpp b/boost/log/sinks/unlocked_frontend.hpp new file mode 100644 index 0000000000..ab144d57b8 --- /dev/null +++ b/boost/log/sinks/unlocked_frontend.hpp @@ -0,0 +1,142 @@ +/* + * Copyright Andrey Semashev 2007 - 2014. + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE_1_0.txt or copy at + * http://www.boost.org/LICENSE_1_0.txt) + */ +/*! + * \file unlocked_frontend.hpp + * \author Andrey Semashev + * \date 14.07.2009 + * + * The header contains declaration of an unlocked sink frontend. + */ + +#ifndef BOOST_LOG_SINKS_UNLOCKED_FRONTEND_HPP_INCLUDED_ +#define BOOST_LOG_SINKS_UNLOCKED_FRONTEND_HPP_INCLUDED_ + +#include <boost/static_assert.hpp> +#include <boost/smart_ptr/shared_ptr.hpp> +#include <boost/smart_ptr/make_shared_object.hpp> +#include <boost/log/detail/config.hpp> +#include <boost/log/detail/parameter_tools.hpp> +#include <boost/log/detail/fake_mutex.hpp> +#include <boost/log/sinks/basic_sink_frontend.hpp> +#include <boost/log/sinks/frontend_requirements.hpp> +#include <boost/log/detail/header.hpp> + +#ifdef BOOST_HAS_PRAGMA_ONCE +#pragma once +#endif + +namespace boost { + +BOOST_LOG_OPEN_NAMESPACE + +namespace sinks { + +#ifndef BOOST_LOG_DOXYGEN_PASS + +#define BOOST_LOG_SINK_CTOR_FORWARD_INTERNAL(z, n, types)\ + template< BOOST_PP_ENUM_PARAMS(n, typename T) >\ + explicit unlocked_sink(BOOST_PP_ENUM_BINARY_PARAMS(n, T, const& arg)) :\ + base_type(false),\ + m_pBackend(boost::make_shared< sink_backend_type >(BOOST_PP_ENUM_PARAMS(n, arg))) {} + +#endif // BOOST_LOG_DOXYGEN_PASS + +/*! + * \brief Non-blocking logging sink frontend + * + * The sink frontend does not perform thread synchronization and + * simply passes logging records to the sink backend. + */ +template< typename SinkBackendT > +class unlocked_sink : + public aux::make_sink_frontend_base< SinkBackendT >::type +{ + typedef typename aux::make_sink_frontend_base< SinkBackendT >::type base_type; + +public: + //! Sink implementation type + typedef SinkBackendT sink_backend_type; + //! \cond + BOOST_STATIC_ASSERT_MSG((has_requirement< typename sink_backend_type::frontend_requirements, concurrent_feeding >::value), "Unlocked sink frontend is incompatible with the specified backend: thread synchronization requirements are not met"); + //! \endcond + + //! Type of pointer to the backend + typedef shared_ptr< sink_backend_type > locked_backend_ptr; + +private: + //! Pointer to the backend + const shared_ptr< sink_backend_type > m_pBackend; + +public: + /*! + * Default constructor. Constructs the sink backend instance. + * Requires the backend to be default-constructible. + */ + unlocked_sink() : + base_type(false), + m_pBackend(boost::make_shared< sink_backend_type >()) + { + } + /*! + * Constructor attaches user-constructed backend instance + * + * \param backend Pointer to the backend instance + * + * \pre \a backend is not \c NULL. + */ + explicit unlocked_sink(shared_ptr< sink_backend_type > const& backend) : + base_type(false), + m_pBackend(backend) + { + } + + // Constructors that pass arbitrary parameters to the backend constructor + BOOST_LOG_PARAMETRIZED_CONSTRUCTORS_GEN(BOOST_LOG_SINK_CTOR_FORWARD_INTERNAL, ~) + + /*! + * Locking accessor to the attached backend. + * + * \note Does not do any actual locking, provided only for interface consistency + * with other frontends. + */ + locked_backend_ptr locked_backend() + { + return m_pBackend; + } + + /*! + * Passes the log record to the backend + */ + void consume(record_view const& rec) + { + boost::log::aux::fake_mutex m; + base_type::feed_record(rec, m, *m_pBackend); + } + + /*! + * The method performs flushing of any internal buffers that may hold log records. The method + * may take considerable time to complete and may block both the calling thread and threads + * attempting to put new records into the sink while this call is in progress. + */ + void flush() + { + boost::log::aux::fake_mutex m; + base_type::flush_backend(m, *m_pBackend); + } +}; + +#undef BOOST_LOG_SINK_CTOR_FORWARD_INTERNAL + +} // namespace sinks + +BOOST_LOG_CLOSE_NAMESPACE // namespace log + +} // namespace boost + +#include <boost/log/detail/footer.hpp> + +#endif // BOOST_LOG_SINKS_UNLOCKED_FRONTEND_HPP_INCLUDED_ |