summaryrefslogtreecommitdiff
path: root/boost/compute/async/wait_guard.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/compute/async/wait_guard.hpp')
-rw-r--r--boost/compute/async/wait_guard.hpp63
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