diff options
author | Princeton Ferro <princetonferro@gmail.com> | 2022-01-13 02:40:18 -0500 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2022-01-17 17:33:22 +0100 |
commit | 45fe8523ad392f1aaa0f24d83b63e91774938775 (patch) | |
tree | 08b17992102f62a18712d1d563461ee481568732 /tests/asynchronous/method-main-async.c-expected | |
parent | cd25750b52d03962220663e5c29d2a336a5fceaa (diff) | |
download | vala-45fe8523ad392f1aaa0f24d83b63e91774938775.tar.gz |
codegen: Add support for async main
If main() is async then setup a new GMainLoop and call _vala_main()
asynchronously.
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1275
Diffstat (limited to 'tests/asynchronous/method-main-async.c-expected')
-rw-r--r-- | tests/asynchronous/method-main-async.c-expected | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/tests/asynchronous/method-main-async.c-expected b/tests/asynchronous/method-main-async.c-expected new file mode 100644 index 000000000..968f8eef4 --- /dev/null +++ b/tests/asynchronous/method-main-async.c-expected @@ -0,0 +1,138 @@ +/* asynchronous_method_main_async.c generated by valac, the Vala compiler + * generated from asynchronous_method_main_async.vala, do not modify */ + +#include <gio/gio.h> +#include <stdlib.h> +#include <string.h> +#include <glib.h> + +#define _g_free0(var) (var = (g_free (var), NULL)) +typedef struct _ValaMainAsyncData ValaMainAsyncData; +#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); +#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return; } +#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return val; } +#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); + +struct _ValaMainAsyncData { + int _state_; + GObject* _source_object_; + GAsyncResult* _res_; + GTask* _async_result; + gchar** args; + gint args_length1; + gint result; + const gchar* _tmp0_; + gchar* foo; + const gchar* _tmp1_; + gchar* _tmp2_; +}; + +static gint _vala_main_async_result; + +static void _vala_main_async_data_free (gpointer _data); +static void _vala_main_async (gchar** args, + gint args_length1, + GAsyncReadyCallback _callback_, + gpointer _user_data_); +static gint _vala_main_finish (GAsyncResult* _res_); +static gboolean _vala_main_async_co (ValaMainAsyncData* _data_); +static gboolean __vala_main_async_co_gsource_func (gpointer self); + +static void +_vala_main_async_data_free (gpointer _data) +{ + ValaMainAsyncData* _data_; + _data_ = _data; + g_slice_free (ValaMainAsyncData, _data_); +} + +void +_vala_main_async (gchar** args, + gint args_length1, + GAsyncReadyCallback _callback_, + gpointer _user_data_) +{ + ValaMainAsyncData* _data_; + _data_ = g_slice_new0 (ValaMainAsyncData); + _data_->_async_result = g_task_new (NULL, NULL, _callback_, _user_data_); + g_task_set_task_data (_data_->_async_result, _data_, _vala_main_async_data_free); + _data_->args = args; + _data_->args_length1 = args_length1; + _vala_main_async_co (_data_); +} + +gint +_vala_main_finish (GAsyncResult* _res_) +{ + gint result; + ValaMainAsyncData* _data_; + _data_ = g_task_propagate_pointer (G_TASK (_res_), NULL); + result = _data_->result; + return result; +} + +static gboolean +__vala_main_async_co_gsource_func (gpointer self) +{ + gboolean result; + result = _vala_main_async_co (self); + return result; +} + +static gboolean +_vala_main_async_co (ValaMainAsyncData* _data_) +{ + switch (_data_->_state_) { + case 0: + goto _state_0; + case 1: + goto _state_1; + default: + g_assert_not_reached (); + } + _state_0: + _vala_assert (_data_->args_length1 >= 1, "args.length >= 1"); + _data_->_tmp0_ = _data_->args[0]; + _vala_assert (_data_->_tmp0_ != NULL, "args[0] != null"); + _data_->_tmp1_ = _data_->args[0]; + _data_->_tmp2_ = g_strdup (_data_->_tmp1_); + _data_->foo = _data_->_tmp2_; + g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, __vala_main_async_co_gsource_func, _data_, NULL); + _data_->_state_ = 1; + return FALSE; + _state_1: + ; + _vala_assert (g_strcmp0 (_data_->foo, "./asynchronous_method_main_async") == 0, "foo == \"./asynchronous_method_main_async\""); + _data_->result = 0; + _g_free0 (_data_->foo); + g_task_return_pointer (_data_->_async_result, _data_, NULL); + if (_data_->_state_ != 0) { + while (!g_task_get_completed (_data_->_async_result)) { + g_main_context_iteration (g_task_get_context (_data_->_async_result), TRUE); + } + } + g_object_unref (_data_->_async_result); + return FALSE; +} + +static void +_vala_main_async_callback (GObject* source_object, + GAsyncResult* res, + gpointer user_data) +{ + GMainLoop* loop = user_data; + _vala_main_async_result = _vala_main_finish (res); + g_main_loop_quit (loop); +} + +int +main (int argc, + char ** argv) +{ + GMainLoop* loop = g_main_loop_new (NULL, FALSE); + _vala_main_async (argv, argc, _vala_main_async_callback, loop); + g_main_loop_run (loop); + g_main_loop_unref (loop); + return _vala_main_async_result; +} + |