/** * Test no errors. * */ static void errorNoneTest() { GError *err = NULL; int status = errorL2Aux(TEST_CCL_SUCCESS, "called by errorOneLevelTest", &err); ccl_if_err_goto(err, error_handler); CCL_UNUSED(status); /* Avoid compiler warnings. */ goto cleanup; error_handler: g_assert_not_reached(); g_error_free(err); cleanup: g_assert_no_error(err); return; }
/** * Test two level error handling. * */ static void errorTwoLevelTest() { GError *err = NULL; int status = errorL1Aux(TEST_CCL_ERROR_2, &err); ccl_if_err_goto(err, error_handler); CCL_UNUSED(status); /* Avoid compiler warnings. */ g_assert_not_reached(); goto cleanup; error_handler: g_assert_error(err, TEST_CCL_ERROR, TEST_CCL_ERROR_2); g_assert_cmpstr(err->message, ==, "Big error in level 2 function: called by errorL1Aux"); g_error_free(err); cleanup: return; }
/** * Get a ::CCLWrapperInfo kernel argument information object. * * @public @memberof ccl_kernel * @see ccl_wrapper_get_info() * @note Requires OpenCL >= 1.2 * * @param[in] krnl The kernel wrapper object. * @param[in] idx Argument index. * @param[in] param_name Name of information/parameter to get. * @param[out] err Return location for a ::CCLErr object, or `NULL` if error * reporting is to be ignored. * @return The requested kernel argument information object. This * object will be automatically freed when the kernel wrapper object is * destroyed. If an error occurs, NULL is returned. * */ CCL_EXPORT CCLWrapperInfo* ccl_kernel_get_arg_info(CCLKernel* krnl, cl_uint idx, cl_kernel_arg_info param_name, CCLErr** err) { /* Make sure krnl is not NULL. */ g_return_val_if_fail(krnl != NULL, NULL); /* Helper wrapper. */ CCLWrapper fake_wrapper; /* Kernel information to return. */ CCLWrapperInfo* info; /* Error handling object. */ CCLErr* err_internal = NULL; /* OpenCL version of the underlying platform. */ double ocl_ver; #ifndef CL_VERSION_1_2 CCL_UNUSED(idx); CCL_UNUSED(param_name); CCL_UNUSED(fake_wrapper); CCL_UNUSED(err_internal); CCL_UNUSED(ocl_ver); /* If cf4ocl was not compiled with support for OpenCL >= 1.2, always throw * error. */ ccl_if_err_create_goto(*err, CCL_ERROR, TRUE, CCL_ERROR_UNSUPPORTED_OCL, error_handler, "%s: Obtaining kernel argument information requires cf4ocl to be " "deployed with support for OpenCL version 1.2 or newer.", CCL_STRD); #else /* Check that context platform is >= OpenCL 1.2 */ ocl_ver = ccl_kernel_get_opencl_version(krnl, &err_internal); ccl_if_err_propagate_goto(err, err_internal, error_handler); /* If OpenCL version is not >= 1.2, throw error. */ ccl_if_err_create_goto(*err, CCL_ERROR, ocl_ver < 120, CCL_ERROR_UNSUPPORTED_OCL, error_handler, "%s: information about kernel arguments requires OpenCL" \ " version 1.2 or newer.", CCL_STRD); /* Wrap argument index in a fake cl_object. */ fake_wrapper.cl_object = GUINT_TO_POINTER(idx); /* Get kernel argument info. */ info = ccl_wrapper_get_info( (CCLWrapper*) krnl, &fake_wrapper, param_name, 0, CCL_INFO_KERNEL_ARG, CL_FALSE, &err_internal); ccl_if_err_propagate_goto(err, err_internal, error_handler); #endif /* If we got here, everything is OK. */ g_assert(err == NULL || *err == NULL); goto finish; error_handler: /* If we got here there was an error, verify that it is so. */ g_assert(err == NULL || *err != NULL); /* An error occurred, return NULL to signal it. */ info = NULL; finish: /* Return argument info. */ return info; }