Skip to content

Commit bfcfcc9

Browse files
committed
Add command_queue_ref
1 parent 30e0085 commit bfcfcc9

1 file changed

Lines changed: 70 additions & 0 deletions

File tree

src/wrap_cl.hpp

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)