// // Copyright (c) 2017 The Khronos Group Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include "testBase.h" #include "action_classes.h" #include "harness/conversions.h" #include #if !defined (_MSC_VER) #include #endif // !_MSC_VER void trigger_user_event(cl_event *event) { usleep(1000000); log_info("\tTriggering gate from separate thread...\n"); clSetUserEventStatus(*event, CL_COMPLETE); } int test_userevents_multithreaded( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements ) { cl_int error; // Set up a user event to act as a gate clEventWrapper gateEvent = clCreateUserEvent( context, &error ); test_error( error, "Unable to create user gate event" ); // Set up a few actions gated on the user event NDRangeKernelAction action1; ReadBufferAction action2; WriteBufferAction action3; clEventWrapper actionEvents[ 3 ]; Action * actions[] = { &action1, &action2, &action3, NULL }; for( int i = 0; actions[ i ] != NULL; i++ ) { error = actions[ i ]->Setup( deviceID, context, queue ); test_error( error, "Unable to set up test action" ); error = actions[ i ]->Execute( queue, 1, &gateEvent, &actionEvents[ i ] ); test_error( error, "Unable to execute test action" ); } // Now, instead of releasing the gate, we spawn a separate thread to do so log_info( "\tStarting trigger thread...\n" ); std::thread thread(trigger_user_event, &gateEvent); log_info( "\tWaiting for actions...\n" ); error = clWaitForEvents( 3, &actionEvents[ 0 ] ); test_error( error, "Unable to wait for action events" ); thread.join(); log_info( "\tActions completed.\n" ); // If we got here without error, we're good return 0; }