summaryrefslogtreecommitdiff
path: root/libclapi/cl_enqueue.c
diff options
context:
space:
mode:
Diffstat (limited to 'libclapi/cl_enqueue.c')
-rw-r--r--libclapi/cl_enqueue.c99
1 files changed, 83 insertions, 16 deletions
diff --git a/libclapi/cl_enqueue.c b/libclapi/cl_enqueue.c
index ef3ada61..991d29d0 100644
--- a/libclapi/cl_enqueue.c
+++ b/libclapi/cl_enqueue.c
@@ -105,7 +105,6 @@ static cl_int check_work_item_ready(cl_command_queue_work_item item)
static void *worker_thread_function(void *Arg)
{
- cl_int ret;
cl_command_queue_worker worker = (cl_command_queue_worker)Arg;
cl_uint last_cookie = worker->cookie;
cl_command_queue_work_item it, start_it;
@@ -155,20 +154,9 @@ static void *worker_thread_function(void *Arg)
if (is_ready < 0) // Error happend, just cancel.
set_work_item_status(ready_one, -1);
- if (ready_one->status == CL_QUEUED) {
- ret = ready_one->submit(ready_one);
- set_work_item_status(ready_one, ret);
- }
-
- if (ready_one->status == CL_SUBMITTED) {
- ret = ready_one->run(ready_one);
- set_work_item_status(ready_one, ret);
- }
-
- if (ready_one->status == CL_RUNNING) {
- ret = ready_one->complete(ready_one);
- set_work_item_status(ready_one, ret);
- }
+ cl_enqueue_submit_work_item(worker->queue, ready_one);
+ cl_enqueue_run_work_item(worker->queue, ready_one);
+ cl_enqueue_complete_work_item(worker->queue, ready_one);
cl_enqueue_destroy_work_item(worker->queue, ready_one);
CL_MUTEX_LOCK(&worker->mutex);
@@ -184,7 +172,64 @@ static void *worker_thread_function(void *Arg)
return NULL;
}
-LOCAL cl_int cl_enqueue_queue_work_item(cl_command_queue queue, cl_command_queue_work_item item)
+LOCAL cl_int cl_enqueue_submit_work_item(cl_command_queue queue, cl_command_queue_work_item item)
+{
+ cl_int ret;
+
+ assert(item->queue == queue);
+ if (item->event) {
+ assert(item->event->queue == queue); //Should belong to this queue.
+ }
+
+ if (item->status == CL_QUEUED) {
+ ret = item->submit(item);
+ set_work_item_status(item, ret);
+ } else {
+ ret = item->status;
+ }
+
+ return ret;
+}
+
+LOCAL cl_int cl_enqueue_run_work_item(cl_command_queue queue, cl_command_queue_work_item item)
+{
+ cl_int ret;
+
+ assert(item->queue == queue);
+ if (item->event) {
+ assert(item->event->queue == queue); //Should belong to this queue.
+ }
+
+ if (item->status == CL_SUBMITTED) {
+ ret = item->run(item);
+ set_work_item_status(item, ret);
+ } else {
+ ret = item->status;
+ }
+
+ return ret;
+}
+
+LOCAL cl_int cl_enqueue_complete_work_item(cl_command_queue queue, cl_command_queue_work_item item)
+{
+ cl_int ret;
+
+ assert(item->queue == queue);
+ if (item->event) {
+ assert(item->event->queue == queue); //Should belong to this queue.
+ }
+
+ if (item->status == CL_RUNNING) {
+ ret = item->complete(item);
+ set_work_item_status(item, ret);
+ } else {
+ ret = item->status;
+ }
+
+ return ret;
+}
+
+LOCAL cl_int cl_enqueue_insert_work_item(cl_command_queue queue, cl_command_queue_work_item item)
{
cl_command_queue_worker worker;
@@ -217,6 +262,28 @@ LOCAL cl_int cl_enqueue_queue_work_item(cl_command_queue queue, cl_command_queue
return CL_SUCCESS;
}
+LOCAL cl_int cl_enqueue_queue_work_item(cl_command_queue queue, cl_command_queue_work_item item)
+{
+ cl_int ret;
+
+ assert(item->queue == queue);
+ if (item->event) {
+ assert(item->event->queue == queue); //Should belong to this queue.
+ }
+
+ if (item->status == CL_QUEUED) {
+ ret = CL_QUEUED;
+ if (cl_enqueue_insert_work_item(queue, item) != CL_SUCCESS) {
+ ret = -1;
+ set_work_item_status(item, ret);
+ }
+ } else {
+ ret = item->status;
+ }
+
+ return ret;
+}
+
LOCAL cl_command_queue_work_item cl_enqueue_create_work_item(cl_command_queue queue,
cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event event)
{