/**
 * 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;
}
Beispiel #3
0
/**
 * 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;

}