1c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
2c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Copyright 2012 Francisco Jerez
3c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
4c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Permission is hereby granted, free of charge, to any person obtaining a
5c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// copy of this software and associated documentation files (the "Software"),
6c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// to deal in the Software without restriction, including without limitation
7c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// the rights to use, copy, modify, merge, publish, distribute, sublicense,
8c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// and/or sell copies of the Software, and to permit persons to whom the
9c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Software is furnished to do so, subject to the following conditions:
10c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
11c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// The above copyright notice and this permission notice shall be included in
12c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// all copies or substantial portions of the Software.
13c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
14c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// OTHER DEALINGS IN THE SOFTWARE.
21c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
22c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
23c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "api/util.hpp"
24c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/event.hpp"
25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezusing namespace clover;
27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
286230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_event
29257781f243476863591965f22787ff390edd8ba0Francisco JerezclCreateUserEvent(cl_context d_ctx, cl_int *r_errcode) try {
309d06fb8fa86a70d1c3a4924960dfebabaf1fa3bfFrancisco Jerez   auto &ctx = obj(d_ctx);
31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
32257781f243476863591965f22787ff390edd8ba0Francisco Jerez   ret_error(r_errcode, CL_SUCCESS);
33257781f243476863591965f22787ff390edd8ba0Francisco Jerez   return desc(new soft_event(ctx, {}, false));
34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
35257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) {
36257781f243476863591965f22787ff390edd8ba0Francisco Jerez   ret_error(r_errcode, e);
37c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return NULL;
38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
39c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
406230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
41257781f243476863591965f22787ff390edd8ba0Francisco JerezclSetUserEventStatus(cl_event d_ev, cl_int status) try {
42257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto &sev = obj<soft_event>(d_ev);
43c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   if (status > 0)
45c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      return CL_INVALID_VALUE;
46c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
47257781f243476863591965f22787ff390edd8ba0Francisco Jerez   if (sev.status() <= 0)
48c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      return CL_INVALID_OPERATION;
49c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
50c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   if (status)
51257781f243476863591965f22787ff390edd8ba0Francisco Jerez      sev.abort(status);
52c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   else
53257781f243476863591965f22787ff390edd8ba0Francisco Jerez      sev.trigger();
54c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
55c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
56257781f243476863591965f22787ff390edd8ba0Francisco Jerez
57257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) {
58257781f243476863591965f22787ff390edd8ba0Francisco Jerez   return e.get();
59c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
616230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
62257781f243476863591965f22787ff390edd8ba0Francisco JerezclWaitForEvents(cl_uint num_evs, const cl_event *d_evs) try {
63257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto evs = objs(d_evs, num_evs);
64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
65257781f243476863591965f22787ff390edd8ba0Francisco Jerez   for (auto &ev : evs) {
66c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez      if (ev.context() != evs.front().context())
67257781f243476863591965f22787ff390edd8ba0Francisco Jerez         throw error(CL_INVALID_CONTEXT);
68c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
69257781f243476863591965f22787ff390edd8ba0Francisco Jerez      if (ev.status() < 0)
70257781f243476863591965f22787ff390edd8ba0Francisco Jerez         throw error(CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST);
71257781f243476863591965f22787ff390edd8ba0Francisco Jerez   }
72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
73c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   // Create a temporary soft event that depends on all the events in
74c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   // the wait list
75a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   auto sev = create<soft_event>(evs.front().context(), evs, true);
76c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
77c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   // ...and wait on it.
78a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   sev().wait();
79c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
80c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
81c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
82257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) {
83c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
84c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
85c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
866230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
87257781f243476863591965f22787ff390edd8ba0Francisco JerezclGetEventInfo(cl_event d_ev, cl_event_info param,
88d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez               size_t size, void *r_buf, size_t *r_size) try {
89d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez   property_buffer buf { r_buf, size, r_size };
90257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto &ev = obj(d_ev);
91c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
92c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   switch (param) {
93c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   case CL_EVENT_COMMAND_QUEUE:
949968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez      buf.as_scalar<cl_command_queue>() = desc(ev.queue());
95d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez      break;
96c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
97c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   case CL_EVENT_CONTEXT:
98c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez      buf.as_scalar<cl_context>() = desc(ev.context());
99d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez      break;
100c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
101c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   case CL_EVENT_COMMAND_TYPE:
102257781f243476863591965f22787ff390edd8ba0Francisco Jerez      buf.as_scalar<cl_command_type>() = ev.command();
103d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez      break;
104c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
105c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   case CL_EVENT_COMMAND_EXECUTION_STATUS:
106257781f243476863591965f22787ff390edd8ba0Francisco Jerez      buf.as_scalar<cl_int>() = ev.status();
107d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez      break;
108c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
109c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   case CL_EVENT_REFERENCE_COUNT:
110257781f243476863591965f22787ff390edd8ba0Francisco Jerez      buf.as_scalar<cl_uint>() = ev.ref_count();
111d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez      break;
112c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
113c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   default:
114d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez      throw error(CL_INVALID_VALUE);
115c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   }
116d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez
117d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez   return CL_SUCCESS;
118d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez
119d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez} catch (error &e) {
120d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez   return e.get();
121c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
122c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
1236230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
124257781f243476863591965f22787ff390edd8ba0Francisco JerezclSetEventCallback(cl_event d_ev, cl_int type,
125257781f243476863591965f22787ff390edd8ba0Francisco Jerez                   void (CL_CALLBACK *pfn_notify)(cl_event, cl_int, void *),
126c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   void *user_data) try {
127257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto &ev = obj(d_ev);
128c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
129257781f243476863591965f22787ff390edd8ba0Francisco Jerez   if (!pfn_notify || type != CL_COMPLETE)
130c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      throw error(CL_INVALID_VALUE);
131c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
132c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   // Create a temporary soft event that depends on ev, with
133257781f243476863591965f22787ff390edd8ba0Francisco Jerez   // pfn_notify as completion action.
134a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   create<soft_event>(ev.context(), ref_vector<event> { ev }, true,
135a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez                      [=, &ev](event &) {
136a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez                         ev.wait();
137a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez                         pfn_notify(desc(ev), ev.status(), user_data);
138a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez                      });
139c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
140c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
141c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
142257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) {
143c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
144c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
145c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
1466230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
147257781f243476863591965f22787ff390edd8ba0Francisco JerezclRetainEvent(cl_event d_ev) try {
148257781f243476863591965f22787ff390edd8ba0Francisco Jerez   obj(d_ev).retain();
149c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
150257781f243476863591965f22787ff390edd8ba0Francisco Jerez
151257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) {
152257781f243476863591965f22787ff390edd8ba0Francisco Jerez   return e.get();
153c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
154c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
1556230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
156257781f243476863591965f22787ff390edd8ba0Francisco JerezclReleaseEvent(cl_event d_ev) try {
157257781f243476863591965f22787ff390edd8ba0Francisco Jerez   if (obj(d_ev).release())
158257781f243476863591965f22787ff390edd8ba0Francisco Jerez      delete pobj(d_ev);
159c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
160c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
161257781f243476863591965f22787ff390edd8ba0Francisco Jerez
162257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) {
163257781f243476863591965f22787ff390edd8ba0Francisco Jerez   return e.get();
164c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
165c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
1666230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
167257781f243476863591965f22787ff390edd8ba0Francisco JerezclEnqueueMarker(cl_command_queue d_q, cl_event *rd_ev) try {
1689968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
169c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
170257781f243476863591965f22787ff390edd8ba0Francisco Jerez   if (!rd_ev)
171c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      throw error(CL_INVALID_VALUE);
172c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
1739968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   *rd_ev = desc(new hard_event(q, CL_COMMAND_MARKER, {}));
174c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
175c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
176c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
177257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) {
178c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
179c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
180c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
1816230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
1825827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge MartinclEnqueueMarkerWithWaitList(cl_command_queue d_q, cl_uint num_deps,
1835827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin                            const cl_event *d_deps, cl_event *rd_ev) try {
1845827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   auto &q = obj(d_q);
1855827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   auto deps = objs<wait_list_tag>(d_deps, num_deps);
1865827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin
1875827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   for (auto &ev : deps) {
1885827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin      if (ev.context() != q.context())
1895827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin         throw error(CL_INVALID_CONTEXT);
1905827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   }
1915827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin
1925827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   // Create a hard event that depends on the events in the wait list:
1935827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   // previous commands in the same queue are implicitly serialized
1945827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   // with respect to it -- hard events always are.
1955827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   auto hev = create<hard_event>(q, CL_COMMAND_MARKER, deps);
1965827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin
1975827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   ret_object(rd_ev, hev);
1985827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   return CL_SUCCESS;
1995827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin
2005827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin} catch (error &e) {
2015827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   return e.get();
2025827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin}
2035827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin
2045827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge MartinCLOVER_API cl_int
2059968d9daf264b726ee50bbc97937daac4e9c1811Francisco JerezclEnqueueBarrier(cl_command_queue d_q) try {
2069968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   obj(d_q);
207c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
208c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   // No need to do anything, q preserves data ordering strictly.
209257781f243476863591965f22787ff390edd8ba0Francisco Jerez
210c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
2119968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez
2129968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez} catch (error &e) {
2139968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   return e.get();
214c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
215c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
2166230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
2175827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge MartinclEnqueueBarrierWithWaitList(cl_command_queue d_q, cl_uint num_deps,
2185827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin                             const cl_event *d_deps, cl_event *rd_ev) try {
2199968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
2205827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   auto deps = objs<wait_list_tag>(d_deps, num_deps);
221c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
2225827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   for (auto &ev : deps) {
223c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez      if (ev.context() != q.context())
224c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez         throw error(CL_INVALID_CONTEXT);
225257781f243476863591965f22787ff390edd8ba0Francisco Jerez   }
226c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
227c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   // Create a hard event that depends on the events in the wait list:
228c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   // subsequent commands in the same queue will be implicitly
229c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   // serialized with respect to it -- hard events always are.
2305827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   auto hev = create<hard_event>(q, CL_COMMAND_BARRIER, deps);
231c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
2325827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   ret_object(rd_ev, hev);
233c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
234c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
235257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) {
236c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
237c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
238c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
2396230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
2405827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge MartinclEnqueueWaitForEvents(cl_command_queue d_q, cl_uint num_evs,
2415827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin                       const cl_event *d_evs) try {
2425827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   // The wait list is mandatory for clEnqueueWaitForEvents().
2435827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   objs(d_evs, num_evs);
2445827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin
2455827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   return clEnqueueBarrierWithWaitList(d_q, num_evs, d_evs, NULL);
2465827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin
2475827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin} catch (error &e) {
2485827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin   return e.get();
2495827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin}
2505827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin
2515827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge MartinCLOVER_API cl_int
252257781f243476863591965f22787ff390edd8ba0Francisco JerezclGetEventProfilingInfo(cl_event d_ev, cl_profiling_info param,
253d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez                        size_t size, void *r_buf, size_t *r_size) try {
254d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez   property_buffer buf { r_buf, size, r_size };
255257781f243476863591965f22787ff390edd8ba0Francisco Jerez   hard_event &hev = dynamic_cast<hard_event &>(obj(d_ev));
256ebfdce079b8f99f92dff4d58a53c27e0888c373fFrancisco Jerez
257257781f243476863591965f22787ff390edd8ba0Francisco Jerez   if (hev.status() != CL_COMPLETE)
258257781f243476863591965f22787ff390edd8ba0Francisco Jerez      throw error(CL_PROFILING_INFO_NOT_AVAILABLE);
2594a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider
2604a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider   switch (param) {
2614a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider   case CL_PROFILING_COMMAND_QUEUED:
262257781f243476863591965f22787ff390edd8ba0Francisco Jerez      buf.as_scalar<cl_ulong>() = hev.time_queued();
263d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez      break;
2644a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider
2654a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider   case CL_PROFILING_COMMAND_SUBMIT:
266257781f243476863591965f22787ff390edd8ba0Francisco Jerez      buf.as_scalar<cl_ulong>() = hev.time_submit();
267d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez      break;
2684a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider
2694a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider   case CL_PROFILING_COMMAND_START:
270257781f243476863591965f22787ff390edd8ba0Francisco Jerez      buf.as_scalar<cl_ulong>() = hev.time_start();
271d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez      break;
2724a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider
2734a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider   case CL_PROFILING_COMMAND_END:
274257781f243476863591965f22787ff390edd8ba0Francisco Jerez      buf.as_scalar<cl_ulong>() = hev.time_end();
275d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez      break;
2764a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider
2774a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider   default:
278d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez      throw error(CL_INVALID_VALUE);
2794a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider   }
280ebfdce079b8f99f92dff4d58a53c27e0888c373fFrancisco Jerez
281d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez   return CL_SUCCESS;
282d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez
283257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (std::bad_cast &e) {
284257781f243476863591965f22787ff390edd8ba0Francisco Jerez   return CL_PROFILING_INFO_NOT_AVAILABLE;
285257781f243476863591965f22787ff390edd8ba0Francisco Jerez
286ebfdce079b8f99f92dff4d58a53c27e0888c373fFrancisco Jerez} catch (lazy<cl_ulong>::undefined_error &e) {
287ebfdce079b8f99f92dff4d58a53c27e0888c373fFrancisco Jerez   return CL_PROFILING_INFO_NOT_AVAILABLE;
288ebfdce079b8f99f92dff4d58a53c27e0888c373fFrancisco Jerez
289ebfdce079b8f99f92dff4d58a53c27e0888c373fFrancisco Jerez} catch (error &e) {
290ebfdce079b8f99f92dff4d58a53c27e0888c373fFrancisco Jerez   return e.get();
291c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
292c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
2936230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
294257781f243476863591965f22787ff390edd8ba0Francisco JerezclFinish(cl_command_queue d_q) try {
2959968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
296c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
297c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   // Create a temporary hard event -- it implicitly depends on all
298c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   // the previously queued hard events.
299a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   auto hev = create<hard_event>(q, 0, ref_vector<event> {});
300c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
301c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   // And wait on it.
302a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   hev().wait();
303c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
304c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
305c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
306257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) {
307c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
308c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
309