static void process_async_call (gpointer data, GckCallClass *klass) { GckCall *call = GCK_CALL (data); g_assert (GCK_IS_CALL (call)); call->rv = perform_call (call->perform, call->cancellable, call->args); g_async_queue_push (klass->completed_queue, call); /* Wakeup main thread if on a separate thread */ g_main_context_wakeup (NULL); }
gboolean _gck_call_sync (gpointer object, gpointer perform, gpointer complete, gpointer data, GCancellable *cancellable, GError **err) { GckArguments *args = (GckArguments*)data; GckModule *module = NULL; CK_RV rv; g_assert (!object || G_IS_OBJECT (object)); g_assert (perform); g_assert (args); if (object) { g_object_get (object, "module", &module, "handle", &args->handle, NULL); g_assert (GCK_IS_MODULE (module)); /* We now hold a reference to module until below */ args->pkcs11 = gck_module_get_functions (module); g_assert (args->pkcs11); } do { rv = perform_call (perform, cancellable, args); if (rv == CKR_FUNCTION_CANCELED) break; } while (!complete_call (complete, args, rv)); if (module) g_object_unref (module); if (rv == CKR_OK) return TRUE; g_set_error (err, GCK_ERROR, rv, "%s", gck_message_from_rv (rv)); return FALSE; }
void initialize_and_call(JNIEnv * env, jobject jobj, jdoubleArray args) { jdouble *double_array; int num_args; jfieldID fid; genv = env; if (test_object_handle_class == NULL) { test_object_handle_class = (*env)->GetObjectClass(env, jobj); if (test_object_handle_class == NULL) { native_error("could not get test object class (TestObject)"); } } if (trace_field_id == NULL) { trace_field_id = (*env)->GetFieldID(env, test_object_handle_class, "t", "Lorg/iguanatool/testobject/trace/Trace;"); if (trace_field_id == NULL) { native_error("could not get trace field ID of TestObject"); } } trace_object = (*env)->GetObjectField(env, jobj, trace_field_id); if (trace_object == NULL) { native_error("could not get trace field of TestObject instance (object not initialized?)"); } if (trace_class == NULL) { trace_class = (*env)->GetObjectClass(env, trace_object); if (trace_class == NULL) { native_error("could not get trace class (Trace)"); } node_method_id = (*genv)->GetMethodID(genv, trace_class, "node", "(IZ)Z"); if (node_method_id == NULL) { native_error("could not get Trace.node() method ID"); } is_true_method_id = (*genv)->GetMethodID(genv, trace_class, "isTrue", "(ID)Z"); if (is_true_method_id == NULL) { native_error("could not get Trace.isTrue() method ID"); } ref_equals_method_id = (*genv)->GetMethodID(genv, trace_class, "refEquals", "(IZ)Z"); if (ref_equals_method_id == NULL) { native_error("could not get Trace.refEquals() method ID"); } ref_not_equals_method_id = (*genv)->GetMethodID(genv, trace_class, "refNotEquals", "(IZ)Z"); if (ref_not_equals_method_id == NULL) { native_error("could not get Trace.refNotEquals() method ID"); } equals_method_id = (*genv)->GetMethodID(genv, trace_class, "equals", "(IDD)Z"); if (equals_method_id == NULL) { native_error("could not get Trace.equals() method ID"); } not_equals_method_id = (*genv)->GetMethodID(genv, trace_class, "notEquals", "(IDD)Z"); if (not_equals_method_id == NULL) { native_error("could not get Trace.notEquals() method ID"); } less_than_method_id = (*genv)->GetMethodID(genv, trace_class, "lessThan", "(IDD)Z"); if (less_than_method_id == NULL) { native_error("could not get Trace.lessThan() method ID"); } less_than_or_equal_method_id = (*genv)->GetMethodID(genv, trace_class, "lessThanOrEqual", "(IDD)Z"); if (less_than_or_equal_method_id == NULL) { native_error("could not get Trace.lessThanOrEqual() method ID"); } greater_than_method_id = (*genv)->GetMethodID(genv, trace_class, "greaterThan", "(IDD)Z"); if (greater_than_method_id == NULL) { native_error("could not get Trace.greaterThan() method ID"); } greater_than_or_equal_method_id = (*genv)->GetMethodID(genv, trace_class, "greaterThanOrEqual", "(IDD)Z"); if (greater_than_or_equal_method_id == NULL) { native_error("could not get Trace.greaterThanOrEqual() method ID"); } } double_array = (*env)->GetDoubleArrayElements(env, args, NULL); if (double_array == NULL) { native_error("could not convert test object arguments to native double array"); } num_args = (*env)->GetArrayLength(env, args); if (!setjmp(__ins_early_exit_temp)) { perform_call(double_array, num_args); } (*env)->ReleaseDoubleArrayElements(env, args, double_array, 0); }