diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2016-12-14 14:14:23 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2016-12-14 19:02:17 +0100 |
commit | a27219c5da0f622e148a3e6927a3ea8cefa337d8 (patch) | |
tree | ef77e4bb8db86b6998001ec29d3d9d4165d41808 | |
parent | b836644e3bf686f4bacd448226b71e88d4d97958 (diff) | |
download | vala-a27219c5da0f622e148a3e6927a3ea8cefa337d8.tar.gz |
codegen: Compensate for the lack of g_task_get_completed on glib < 2.44
If a target glib between 2.36 and 2.44 is used, store a boolean var
in the async task data, which is initialized to FALSE and set to
TRUE in the async task callback, so async-forced-to-sync like the
async generator example can block until the task is complete.
There is one special case, if the async task receives no callback
to execute, the boolean flag is set to TRUE right away, as it
will be "finished" by the first time it's checked.
https://bugzilla.gnome.org/show_bug.cgi?id=763345
-rw-r--r-- | codegen/valaccodemethodmodule.vala | 13 | ||||
-rw-r--r-- | codegen/valagasyncmodule.vala | 22 |
2 files changed, 32 insertions, 3 deletions
diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala index 3a89c7e41..6d8d3b6ed 100644 --- a/codegen/valaccodemethodmodule.vala +++ b/codegen/valaccodemethodmodule.vala @@ -140,9 +140,16 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule { var state_is_not_zero = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, state, zero); ccode.open_if (state_is_not_zero); - var task_complete = new CCodeFunctionCall (new CCodeIdentifier ("g_task_get_completed")); - task_complete.add_argument (async_result_expr); - var task_is_complete = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, task_complete, new CCodeConstant ("TRUE")); + CCodeBinaryExpression task_is_complete; + + if (context.require_glib_version (2, 44)) { + var task_complete = new CCodeFunctionCall (new CCodeIdentifier ("g_task_get_completed")); + task_complete.add_argument (async_result_expr); + task_is_complete = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, task_complete, new CCodeConstant ("TRUE")); + } else { + var task_complete = new CCodeMemberAccess.pointer (new CCodeIdentifier ("_data_"), "_task_complete_"); + task_is_complete = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, task_complete, new CCodeConstant ("TRUE")); + } ccode.open_while (task_is_complete); var task_context = new CCodeFunctionCall (new CCodeIdentifier ("g_task_get_context")); diff --git a/codegen/valagasyncmodule.vala b/codegen/valagasyncmodule.vala index 85d6ac5c0..d389ae6db 100644 --- a/codegen/valagasyncmodule.vala +++ b/codegen/valagasyncmodule.vala @@ -33,6 +33,9 @@ public class Vala.GAsyncModule : GtkModule { if (context.require_glib_version (2, 36)) { data.add_field ("GTask*", "_async_result"); + if (!context.require_glib_version (2, 44)) { + data.add_field ("gboolean", "_task_complete_"); + } } else { data.add_field ("GSimpleAsyncResult*", "_async_result"); } @@ -262,6 +265,16 @@ public class Vala.GAsyncModule : GtkModule { if (!context.require_glib_version (2, 36)) { attach_data_call = new CCodeFunctionCall (new CCodeIdentifier ("g_simple_async_result_set_op_res_gpointer")); } else { + if (!context.require_glib_version (2, 44)) { + var task_completed_var = new CCodeMemberAccess.pointer (data_var, "_task_complete_"); + var callback = new CCodeIdentifier ("_callback_"); + var callback_is_null = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, callback, new CCodeConstant ("NULL")); + + ccode.open_if (callback_is_null); + ccode.add_assignment (task_completed_var, new CCodeConstant ("TRUE")); + ccode.close (); + } + attach_data_call = new CCodeFunctionCall (new CCodeIdentifier ("g_task_set_task_data")); } @@ -593,6 +606,11 @@ public class Vala.GAsyncModule : GtkModule { return_default_value (return_type); ccode.close (); } + + if (!context.require_glib_version (2, 44)) { + var task_completed_var = new CCodeMemberAccess.pointer (data_var, "_task_complete_"); + ccode.add_assignment (task_completed_var, new CCodeConstant ("TRUE")); + } } else { var simple_async_result_cast = new CCodeFunctionCall (new CCodeIdentifier ("G_SIMPLE_ASYNC_RESULT")); simple_async_result_cast.add_argument (new CCodeIdentifier ("_res_")); @@ -683,6 +701,10 @@ public class Vala.GAsyncModule : GtkModule { ccode.add_assignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("_data_"), "_source_object_"), new CCodeIdentifier ("source_object")); ccode.add_assignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("_data_"), "_res_"), new CCodeIdentifier ("_res_")); + if (context.require_glib_version (2, 36) && !context.require_glib_version (2, 44)) { + ccode.add_assignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("_data_"), "_task_complete_"), new CCodeConstant ("TRUE")); + } + var ccall = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_real_name (m) + "_co")); ccall.add_argument (new CCodeIdentifier ("_data_")); ccode.add_expression (ccall); |