/* asynchronous_bug741929.c generated by valac, the Vala compiler
 * generated from asynchronous_bug741929.vala, do not modify */

#include <glib.h>
#include <glib-object.h>
#include <gio/gio.h>

#if !defined(VALA_STRICT_C)
#if !defined(__clang__) && defined(__GNUC__) && (__GNUC__ >= 14)
#pragma GCC diagnostic warning "-Wincompatible-pointer-types"
#elif defined(__clang__) && (__clang_major__ >= 16)
#pragma clang diagnostic ignored "-Wincompatible-function-pointer-types"
#pragma clang diagnostic ignored "-Wincompatible-pointer-types"
#endif
#endif
#if !defined(VALA_EXTERN)
#if defined(_MSC_VER)
#define VALA_EXTERN __declspec(dllexport) extern
#elif __GNUC__ >= 4
#define VALA_EXTERN __attribute__((visibility("default"))) extern
#else
#define VALA_EXTERN extern
#endif
#endif

#define TYPE_FOO (foo_get_type ())
#define FOO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_FOO, Foo))
#define FOO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_FOO, FooClass))
#define IS_FOO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_FOO))
#define IS_FOO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_FOO))
#define FOO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_FOO, FooClass))

typedef struct _Foo Foo;
typedef struct _FooClass FooClass;
typedef struct _FooPrivate FooPrivate;
enum  {
	FOO_0_PROPERTY,
	FOO_NUM_PROPERTIES
};
static GParamSpec* foo_properties[FOO_NUM_PROPERTIES];
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
typedef struct _FooQueryAsyncData FooQueryAsyncData;
typedef struct _FooInternalQueryAsyncData FooInternalQueryAsyncData;
typedef struct _FooCloseQueryAsyncData FooCloseQueryAsyncData;
typedef struct _GoAsyncData GoAsyncData;
#define _g_main_loop_unref0(var) ((var == NULL) ? NULL : (var = (g_main_loop_unref (var), NULL)))

struct _Foo {
	GObject parent_instance;
	FooPrivate * priv;
};

struct _FooClass {
	GObjectClass parent_class;
};

struct _FooPrivate {
	gboolean running;
};

struct _FooQueryAsyncData {
	int _state_;
	GObject* _source_object_;
	GAsyncResult* _res_;
	GTask* _async_result;
	Foo* self;
	gboolean _tmp0_;
	GError* _inner_error1_;
	GError* _inner_error0_;
};

struct _FooInternalQueryAsyncData {
	int _state_;
	GObject* _source_object_;
	GAsyncResult* _res_;
	GTask* _async_result;
	Foo* self;
	gboolean result;
};

struct _FooCloseQueryAsyncData {
	int _state_;
	GObject* _source_object_;
	GAsyncResult* _res_;
	GTask* _async_result;
	Foo* self;
};

struct _GoAsyncData {
	int _state_;
	GObject* _source_object_;
	GAsyncResult* _res_;
	GTask* _async_result;
	Foo* foo;
	Foo* _tmp0_;
	GMainLoop* _tmp1_;
	GError* _inner_error0_;
};

VALA_EXTERN GMainLoop* loop;
GMainLoop* loop = NULL;
static gint Foo_private_offset;
static gpointer foo_parent_class = NULL;

VALA_EXTERN GType foo_get_type (void) G_GNUC_CONST ;
G_DEFINE_AUTOPTR_CLEANUP_FUNC (Foo, g_object_unref)
VALA_EXTERN Foo* foo_new (void);
VALA_EXTERN Foo* foo_construct (GType object_type);
static void foo_query_async_data_free (gpointer _data);
VALA_EXTERN void foo_query_async (Foo* self,
                      GAsyncReadyCallback _callback_,
                      gpointer _user_data_);
VALA_EXTERN void foo_query_finish (Foo* self,
                       GAsyncResult* _res_,
                       GError** error);
static gboolean foo_query_async_co (FooQueryAsyncData* _data_);
static void foo_internal_query_async (Foo* self,
                               GAsyncReadyCallback _callback_,
                               gpointer _user_data_);
static gboolean foo_internal_query_finish (Foo* self,
                                    GAsyncResult* _res_,
                                    GError** error);
static void foo_query_async_ready (GObject* source_object,
                            GAsyncResult* _res_,
                            gpointer _user_data_);
static void foo_close_query_async (Foo* self,
                            GAsyncReadyCallback _callback_,
                            gpointer _user_data_);
static void foo_close_query_finish (Foo* self,
                             GAsyncResult* _res_,
                             GError** error);
static void foo_internal_query_async_data_free (gpointer _data);
static gboolean foo_internal_query_async_co (FooInternalQueryAsyncData* _data_);
static void foo_close_query_async_data_free (gpointer _data);
static gboolean foo_close_query_async_co (FooCloseQueryAsyncData* _data_);
static void foo_finalize (GObject * obj);
static GType foo_get_type_once (void);
static void go_async_data_free (gpointer _data);
VALA_EXTERN void go_async (GAsyncReadyCallback _callback_,
               gpointer _user_data_);
VALA_EXTERN void go_finish (GAsyncResult* _res_);
static gboolean go_async_co (GoAsyncData* _data_);
static void go_async_ready (GObject* source_object,
                     GAsyncResult* _res_,
                     gpointer _user_data_);
static void _vala_main (void);

static inline gpointer
foo_get_instance_private (Foo* self)
{
	return G_STRUCT_MEMBER_P (self, Foo_private_offset);
}

Foo*
foo_construct (GType object_type)
{
	Foo * self = NULL;
	self = (Foo*) g_object_new (object_type, NULL);
	return self;
}

Foo*
foo_new (void)
{
	return foo_construct (TYPE_FOO);
}

static void
foo_query_async_data_free (gpointer _data)
{
	FooQueryAsyncData* _data_;
	_data_ = _data;
	_g_object_unref0 (_data_->self);
	g_slice_free (FooQueryAsyncData, _data_);
}

static gpointer
_g_object_ref0 (gpointer self)
{
	return self ? g_object_ref (self) : NULL;
}

void
foo_query_async (Foo* self,
                 GAsyncReadyCallback _callback_,
                 gpointer _user_data_)
{
	FooQueryAsyncData* _data_;
	Foo* _tmp0_;
	g_return_if_fail (IS_FOO (self));
	_data_ = g_slice_new0 (FooQueryAsyncData);
	_data_->_async_result = g_task_new (G_OBJECT (self), NULL, _callback_, _user_data_);
	g_task_set_task_data (_data_->_async_result, _data_, foo_query_async_data_free);
	_tmp0_ = _g_object_ref0 (self);
	_data_->self = _tmp0_;
	foo_query_async_co (_data_);
}

void
foo_query_finish (Foo* self,
                  GAsyncResult* _res_,
                  GError** error)
{
	FooQueryAsyncData* _data_;
	_data_ = g_task_propagate_pointer (G_TASK (_res_), error);
	if (NULL == _data_) {
		return;
	}
}

static void
foo_query_async_ready (GObject* source_object,
                       GAsyncResult* _res_,
                       gpointer _user_data_)
{
	FooQueryAsyncData* _data_;
	_data_ = _user_data_;
	_data_->_source_object_ = source_object;
	_data_->_res_ = _res_;
	foo_query_async_co (_data_);
}

static gboolean
foo_query_async_co (FooQueryAsyncData* _data_)
{
	switch (_data_->_state_) {
		case 0:
		goto _state_0;
		case 1:
		goto _state_1;
		case 2:
		goto _state_2;
		case 3:
		goto _state_3;
		default:
		g_assert_not_reached ();
	}
	_state_0:
	_data_->self->priv->running = TRUE;
	{
		_data_->_state_ = 1;
		foo_internal_query_async (_data_->self, foo_query_async_ready, _data_);
		return FALSE;
		_state_1:
		_data_->_tmp0_ = foo_internal_query_finish (_data_->self, _data_->_res_, &_data_->_inner_error0_);
		if (G_UNLIKELY (_data_->_inner_error0_ != NULL)) {
			goto __finally0;
		}
		if (!_data_->_tmp0_) {
			{
				{
					_data_->_state_ = 2;
					foo_close_query_async (_data_->self, foo_query_async_ready, _data_);
					return FALSE;
					_state_2:
					foo_close_query_finish (_data_->self, _data_->_res_, &_data_->_inner_error0_);
					if (G_UNLIKELY (_data_->_inner_error0_ != NULL)) {
						goto __catch1_g_error;
					}
				}
				goto __finally1;
				__catch1_g_error:
				{
					g_clear_error (&_data_->_inner_error0_);
				}
				__finally1:
				if (G_UNLIKELY (_data_->_inner_error0_ != NULL)) {
				}
				_data_->self->priv->running = FALSE;
			}
			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;
		}
	}
	__finally0:
	{
		{
			_data_->_state_ = 3;
			foo_close_query_async (_data_->self, foo_query_async_ready, _data_);
			return FALSE;
			_state_3:
			foo_close_query_finish (_data_->self, _data_->_res_, &_data_->_inner_error1_);
			if (G_UNLIKELY (_data_->_inner_error1_ != NULL)) {
				goto __catch2_g_error;
			}
		}
		goto __finally2;
		__catch2_g_error:
		{
			g_clear_error (&_data_->_inner_error1_);
		}
		__finally2:
		if (G_UNLIKELY (_data_->_inner_error1_ != NULL)) {
			g_task_return_error (_data_->_async_result, _data_->_inner_error1_);
			g_object_unref (_data_->_async_result);
			return FALSE;
		}
		_data_->self->priv->running = FALSE;
	}
	if (G_UNLIKELY (_data_->_inner_error0_ != NULL)) {
		g_task_return_error (_data_->_async_result, _data_->_inner_error0_);
		g_object_unref (_data_->_async_result);
		return FALSE;
	}
	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
foo_internal_query_async_data_free (gpointer _data)
{
	FooInternalQueryAsyncData* _data_;
	_data_ = _data;
	_g_object_unref0 (_data_->self);
	g_slice_free (FooInternalQueryAsyncData, _data_);
}

static void
foo_internal_query_async (Foo* self,
                          GAsyncReadyCallback _callback_,
                          gpointer _user_data_)
{
	FooInternalQueryAsyncData* _data_;
	Foo* _tmp0_;
	g_return_if_fail (IS_FOO (self));
	_data_ = g_slice_new0 (FooInternalQueryAsyncData);
	_data_->_async_result = g_task_new (G_OBJECT (self), NULL, _callback_, _user_data_);
	g_task_set_task_data (_data_->_async_result, _data_, foo_internal_query_async_data_free);
	_tmp0_ = _g_object_ref0 (self);
	_data_->self = _tmp0_;
	foo_internal_query_async_co (_data_);
}

static gboolean
foo_internal_query_finish (Foo* self,
                           GAsyncResult* _res_,
                           GError** error)
{
	gboolean result;
	FooInternalQueryAsyncData* _data_;
	_data_ = g_task_propagate_pointer (G_TASK (_res_), error);
	if (NULL == _data_) {
		gboolean _tmp0_ = FALSE;
		return _tmp0_;
	}
	result = _data_->result;
	return result;
}

static gboolean
foo_internal_query_async_co (FooInternalQueryAsyncData* _data_)
{
	switch (_data_->_state_) {
		case 0:
		goto _state_0;
		default:
		g_assert_not_reached ();
	}
	_state_0:
	_data_->result = TRUE;
	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
foo_close_query_async_data_free (gpointer _data)
{
	FooCloseQueryAsyncData* _data_;
	_data_ = _data;
	_g_object_unref0 (_data_->self);
	g_slice_free (FooCloseQueryAsyncData, _data_);
}

static void
foo_close_query_async (Foo* self,
                       GAsyncReadyCallback _callback_,
                       gpointer _user_data_)
{
	FooCloseQueryAsyncData* _data_;
	Foo* _tmp0_;
	g_return_if_fail (IS_FOO (self));
	_data_ = g_slice_new0 (FooCloseQueryAsyncData);
	_data_->_async_result = g_task_new (G_OBJECT (self), NULL, _callback_, _user_data_);
	g_task_set_task_data (_data_->_async_result, _data_, foo_close_query_async_data_free);
	_tmp0_ = _g_object_ref0 (self);
	_data_->self = _tmp0_;
	foo_close_query_async_co (_data_);
}

static void
foo_close_query_finish (Foo* self,
                        GAsyncResult* _res_,
                        GError** error)
{
	FooCloseQueryAsyncData* _data_;
	_data_ = g_task_propagate_pointer (G_TASK (_res_), error);
	if (NULL == _data_) {
		return;
	}
}

static gboolean
foo_close_query_async_co (FooCloseQueryAsyncData* _data_)
{
	switch (_data_->_state_) {
		case 0:
		goto _state_0;
		default:
		g_assert_not_reached ();
	}
	_state_0:
	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
foo_class_init (FooClass * klass,
                gpointer klass_data)
{
	foo_parent_class = g_type_class_peek_parent (klass);
	g_type_class_adjust_private_offset (klass, &Foo_private_offset);
	G_OBJECT_CLASS (klass)->finalize = foo_finalize;
}

static void
foo_instance_init (Foo * self,
                   gpointer klass)
{
	self->priv = foo_get_instance_private (self);
	self->priv->running = FALSE;
}

static void
foo_finalize (GObject * obj)
{
	Foo * self;
	self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_FOO, Foo);
	G_OBJECT_CLASS (foo_parent_class)->finalize (obj);
}

static GType
foo_get_type_once (void)
{
	static const GTypeInfo g_define_type_info = { sizeof (FooClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) foo_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Foo), 0, (GInstanceInitFunc) foo_instance_init, NULL };
	GType foo_type_id;
	foo_type_id = g_type_register_static (G_TYPE_OBJECT, "Foo", &g_define_type_info, 0);
	Foo_private_offset = g_type_add_instance_private (foo_type_id, sizeof (FooPrivate));
	return foo_type_id;
}

GType
foo_get_type (void)
{
	static volatile gsize foo_type_id__once = 0;
	if (g_once_init_enter (&foo_type_id__once)) {
		GType foo_type_id;
		foo_type_id = foo_get_type_once ();
		g_once_init_leave (&foo_type_id__once, foo_type_id);
	}
	return foo_type_id__once;
}

static void
go_async_data_free (gpointer _data)
{
	GoAsyncData* _data_;
	_data_ = _data;
	g_slice_free (GoAsyncData, _data_);
}

void
go_async (GAsyncReadyCallback _callback_,
          gpointer _user_data_)
{
	GoAsyncData* _data_;
	_data_ = g_slice_new0 (GoAsyncData);
	_data_->_async_result = g_task_new (NULL, NULL, _callback_, _user_data_);
	g_task_set_task_data (_data_->_async_result, _data_, go_async_data_free);
	go_async_co (_data_);
}

void
go_finish (GAsyncResult* _res_)
{
	GoAsyncData* _data_;
	_data_ = g_task_propagate_pointer (G_TASK (_res_), NULL);
}

static void
go_async_ready (GObject* source_object,
                GAsyncResult* _res_,
                gpointer _user_data_)
{
	GoAsyncData* _data_;
	_data_ = _user_data_;
	_data_->_source_object_ = source_object;
	_data_->_res_ = _res_;
	go_async_co (_data_);
}

static gboolean
go_async_co (GoAsyncData* _data_)
{
	switch (_data_->_state_) {
		case 0:
		goto _state_0;
		case 1:
		goto _state_1;
		default:
		g_assert_not_reached ();
	}
	_state_0:
	_data_->_tmp0_ = foo_new ();
	_data_->foo = _data_->_tmp0_;
	{
		_data_->_state_ = 1;
		foo_query_async (_data_->foo, go_async_ready, _data_);
		return FALSE;
		_state_1:
		foo_query_finish (_data_->foo, _data_->_res_, &_data_->_inner_error0_);
		if (G_UNLIKELY (_data_->_inner_error0_ != NULL)) {
			goto __catch0_g_error;
		}
	}
	goto __finally0;
	__catch0_g_error:
	{
		g_clear_error (&_data_->_inner_error0_);
	}
	__finally0:
	if (G_UNLIKELY (_data_->_inner_error0_ != NULL)) {
		_g_object_unref0 (_data_->foo);
		g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _data_->_inner_error0_->message, g_quark_to_string (_data_->_inner_error0_->domain), _data_->_inner_error0_->code);
		g_clear_error (&_data_->_inner_error0_);
		g_object_unref (_data_->_async_result);
		return FALSE;
	}
	_data_->_tmp1_ = loop;
	g_main_loop_quit (_data_->_tmp1_);
	_g_object_unref0 (_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 (void)
{
	GMainLoop* _tmp0_;
	GMainLoop* _tmp1_;
	_tmp0_ = g_main_loop_new (NULL, FALSE);
	_g_main_loop_unref0 (loop);
	loop = _tmp0_;
	go_async (NULL, NULL);
	_tmp1_ = loop;
	g_main_loop_run (_tmp1_);
}

int
main (int argc,
      char ** argv)
{
	_vala_main ();
	return 0;
}

