diff options
Diffstat (limited to 'boost/compute/async/wait_guard.hpp')
-rw-r--r-- | boost/compute/async/wait_guard.hpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/boost/compute/async/wait_guard.hpp b/boost/compute/async/wait_guard.hpp new file mode 100644 index 0000000000..46018fa35a --- /dev/null +++ b/boost/compute/async/wait_guard.hpp @@ -0,0 +1,63 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2013-2015 Kyle Lutz <kyle.r.lutz@gmail.com> +// +// 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 +// +// See http://boostorg.github.com/compute for more information. +//---------------------------------------------------------------------------// + +#ifndef BOOST_COMPUTE_ASYNC_WAIT_GUARD_HPP +#define BOOST_COMPUTE_ASYNC_WAIT_GUARD_HPP + +#include <boost/noncopyable.hpp> + +namespace boost { +namespace compute { + +/// \class wait_guard +/// \brief A guard object for synchronizing an operation on the device +/// +/// The wait_guard class stores a waitable object representing an operation +/// on a compute device (e.g. \ref event, \ref future "future<T>") and calls +/// its \c wait() method when the guard object goes out of scope. +/// +/// This is useful for ensuring that an OpenCL operation completes before +/// leaving the current scope and cleaning up any resources. +/// +/// For example: +/// \code +/// // enqueue a compute kernel for execution +/// event e = queue.enqueue_nd_range_kernel(...); +/// +/// // call e.wait() upon exiting the current scope +/// wait_guard<event> guard(e); +/// \endcode +/// +/// \ref wait_list, wait_for_all() +template<class Waitable> +class wait_guard : boost::noncopyable +{ +public: + /// Creates a new wait_guard object for \p waitable. + wait_guard(const Waitable &waitable) + : m_waitable(waitable) + { + } + + /// Destroys the wait_guard object. The default implementation will call + /// \c wait() on the stored waitable object. + ~wait_guard() + { + m_waitable.wait(); + } + +private: + Waitable m_waitable; +}; + +} // end compute namespace +} // end boost namespace + +#endif // BOOST_COMPUTE_ASYNC_WAIT_GUARD_HPP |