diff options
Diffstat (limited to 'libclapi/cl_enqueue.c')
-rw-r--r-- | libclapi/cl_enqueue.c | 99 |
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) { |