@@ -1668,6 +1668,76 @@ namespace pyopencl
16681668 // }}}
16691669
16701670
1671+ // {{{ command_queue_ref
1672+
1673+ // In contrast to command_queue, command_queue_ref is "nullable", i.e.
1674+ // it is a RAII *optional* reference to a command queue.
1675+
1676+ class command_queue_ref
1677+ {
1678+ private:
1679+ bool m_valid;
1680+ cl_command_queue m_queue;
1681+
1682+ public:
1683+ command_queue_ref ()
1684+ : m_valid(false )
1685+ {}
1686+
1687+ command_queue_ref (cl_command_queue queue)
1688+ : m_valid(true ), m_queue(queue)
1689+ {
1690+ PYOPENCL_CALL_GUARDED (clRetainCommandQueue, (m_queue));
1691+ }
1692+
1693+ command_queue_ref (command_queue_ref &&src)
1694+ : m_valid(src.m_valid), m_queue(src.m_queue)
1695+ {
1696+ src.m_valid = false ;
1697+ }
1698+
1699+ command_queue_ref (const command_queue_ref &) = delete ;
1700+ command_queue_ref &operator =(const command_queue_ref &) = delete ;
1701+
1702+ ~command_queue_ref ()
1703+ {
1704+ reset ();
1705+ }
1706+
1707+ bool is_valid () const
1708+ {
1709+ return m_valid;
1710+ }
1711+
1712+ cl_command_queue data () const
1713+ {
1714+ if (m_valid)
1715+ return m_queue;
1716+ else
1717+ throw error (" command_queue_ref.data" , CL_INVALID_VALUE,
1718+ " command_queue_ref is not valid" );
1719+ }
1720+
1721+ void reset ()
1722+ {
1723+ if (m_valid)
1724+ PYOPENCL_CALL_GUARDED_CLEANUP (clReleaseCommandQueue, (m_queue));
1725+ m_valid = false ;
1726+ }
1727+
1728+ void set (cl_command_queue queue)
1729+ {
1730+ if (m_valid)
1731+ PYOPENCL_CALL_GUARDED (clReleaseCommandQueue, (m_queue));
1732+ m_queue = queue;
1733+ PYOPENCL_CALL_GUARDED (clRetainCommandQueue, (m_queue));
1734+ m_valid = true ;
1735+ }
1736+ };
1737+
1738+ // }}}
1739+
1740+
16711741 // {{{ event/synchronization
16721742
16731743 class event : noncopyable
0 commit comments