After an evaluation, GNOME has moved from Bugzilla to GitLab. Learn more about GitLab.
No new issues can be reported in GNOME Bugzilla anymore.
To report an issue in a GNOME project, go to GNOME GitLab.
Do not go to GNOME Gitlab for: Bluefish, Doxygen, GnuCash, GStreamer, java-gnome, LDTP, NetworkManager, Tomboy.
Bug 706517 - Crash on combining conditional epression with async construction
Crash on combining conditional epression with async construction
Status: RESOLVED OBSOLETE
Product: vala
Classification: Core
Component: Async
0.21.x
Other Linux
: Normal normal
: ---
Assigned To: Vala maintainers
Vala maintainers
Depends on:
Blocks:
 
 
Reported: 2013-08-21 17:04 UTC by Zeeshan Ali
Modified: 2018-05-22 14:55 UTC
See Also:
GNOME target: ---
GNOME version: ---



Description Zeeshan Ali 2013-08-21 17:04:40 UTC
Boxes crashed on me and upon investigation I found out that these statements are the culprit:

-----CODE----
    public async InstallerMedia create_installer_media_for_path (string       path,
                                                                 Cancellable? cancellable = null) throws GLib.Error {
        var media = is_mime_type (path, "application/x-cd-image") ?
                    yield new InstallerMedia.for_path (path, this, cancellable) :
                    new InstalledMedia (path);

        return create_installer_media_from_media (media);
    }
-------------

The crash happens because the yielding 'new InstallerMedia.for_path' throws an error and stack trace is:

0x00007ffff2b0af82 in g_object_unref (_object=0x1) at gobject.c:3089
3089	  g_return_if_fail (G_IS_OBJECT (object));
(gdb) bt
  • #0 g_object_unref
    at gobject.c line 3089
  • #1 boxes_media_manager_create_installer_media_for_path_co
    at /extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala line 29
  • #2 boxes_media_manager_create_installer_media_for_path_ready
    at /extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala line 29
  • #3 g_simple_async_result_complete
    at gsimpleasyncresult.c line 777
  • #4 boxes_installer_media_construct_for_path_co
    at /extra-data/checkout/gnome/gnome-boxes/src/installer-media.vala line 66
  • #5 boxes_installer_media_new_for_path_ready
    at /extra-data/checkout/gnome/gnome-boxes/src/installer-media.vala line 60
  • #6 g_simple_async_result_complete
    at gsimpleasyncresult.c line 777
  • #7 boxes_os_database_guess_os_from_install_media_path_co
    at /extra-data/checkout/gnome/gnome-boxes/src/os-database.vala line 58
  • #8 boxes_os_database_guess_os_from_install_media_path_ready
    at /extra-data/checkout/gnome/gnome-boxes/src/os-database.vala line 55
  • #9 g_simple_async_result_complete
    at gsimpleasyncresult.c line 777
  • #10 on_location_read
    at osinfo_media.c line 853
  • #11 g_task_return_now
    at gtask.c line 1108
  • #12 complete_in_idle_cb
    at gtask.c line 1117
  • #13 g_idle_dispatch
    at gmain.c line 5250
  • #14 g_main_dispatch
    at gmain.c line 3065
  • #15 g_main_context_dispatch
    at gmain.c line 3641
  • #16 g_main_context_iterate
    at gmain.c line 3712
  • #17 g_main_context_iteration
    at gmain.c line 3773
  • #18 g_application_run
    at gapplication.c line 1635
  • #19 boxes_app_run
    at /extra-data/checkout/gnome/gnome-boxes/src/app.vala line 323
  • #20 _vala_main
    at /extra-data/checkout/gnome/gnome-boxes/src/main.vala line 85
  • #21 main
    at /extra-data/checkout/gnome/gnome-boxes/src/main.vala line 69

I can work around the issue with this change:

----------DIFF----------
diff --git a/src/media-manager.vala b/src/media-manager.vala
index 270bd76..ad4f5f1 100644
--- a/src/media-manager.vala
+++ b/src/media-manager.vala
@@ -25,9 +25,12 @@ public static MediaManager get_instance () {
 
     public async InstallerMedia create_installer_media_for_path (string       path,
                                                                  Cancellable? cancellable = null) throws GLib.Error {
-        var media = is_mime_type (path, "application/x-cd-image") ?
-                    yield new InstallerMedia.for_path (path, this, cancellable) :
-                    new InstalledMedia (path);
+        InstallerMedia media;
+
+        if (is_mime_type (path, "application/x-cd-image"))
+            media = yield new InstallerMedia.for_path (path, this, cancellable);
+        else
+            media = new InstalledMedia (path);
 
         return create_installer_media_from_media (media);
     }
-------------------------
Comment 1 Maciej (Matthew) Piechotka 2013-08-21 20:37:16 UTC
I tried to run following sample and I could not reproduce it:

public async Object f() throws GLib.Error {
    throw new ThreadError.AGAIN ("Test");
}

public async Object g(bool b) throws GLib.Error {
    Object o = b ? yield f() : new Object ();
    return o;
}

public int main() {
    GLib.MainLoop loop = new GLib.MainLoop ();
    g.begin (true, (obj, res) => {
        try {
            g.end (res);
        } catch (GLib.Error e) {}
        loop.quit ();
    });
    loop.run ();
    return 0;
}

What is relevant C code for boxes_media_manager_create_installer_media_for_path_co?
Comment 2 Zeeshan Ali 2013-08-21 23:21:13 UTC
(In reply to comment #1)
> I tried to run following sample and I could not reproduce it:
> 
> public async Object f() throws GLib.Error {
>     throw new ThreadError.AGAIN ("Test");
> }
> 
> public async Object g(bool b) throws GLib.Error {
>     Object o = b ? yield f() : new Object ();
>     return o;
> }
> 
> public int main() {
>     GLib.MainLoop loop = new GLib.MainLoop ();
>     g.begin (true, (obj, res) => {
>         try {
>             g.end (res);
>         } catch (GLib.Error e) {}
>         loop.quit ();
>     });
>     loop.run ();
>     return 0;
> }

Could you try with only one of them being async (that one that get executed)?

> What is relevant C code for
> boxes_media_manager_create_installer_media_for_path_co?

static gboolean boxes_media_manager_create_installer_media_for_path_co (BoxesMediaManagerCreateInstallerMediaForPathData
#line 26 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        switch (_data_->_state_) {
#line 26 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                case 0:
#line 615 "media-manager.c"
                goto _state_0;
#line 26 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                case 1:
#line 619 "media-manager.c"
                goto _state_1;
                default:
#line 26 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                g_assert_not_reached ();
#line 624 "media-manager.c"
        }
        _state_0:
#line 28 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _data_->_tmp1_ = NULL;
#line 28 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _data_->_tmp1_ = _data_->path;
#line 28 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _data_->_tmp2_ = FALSE;
#line 28 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _data_->_tmp2_ = boxes_is_mime_type (_data_->_tmp1_, "application/x-cd-image");
#line 28 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        if (_data_->_tmp2_) {
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _data_->_tmp3_ = NULL;
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _data_->_tmp3_ = _data_->path;
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _data_->_tmp4_ = NULL;
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _data_->_tmp4_ = _data_->cancellable;
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _data_->_state_ = 1;
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                boxes_installer_media_new_for_path (_data_->_tmp3_, _data_->self, _data_->_tmp4_, boxes_media_manager_cr
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                return FALSE;
#line 651 "media-manager.c"
                _state_1:
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _data_->_tmp5_ = NULL;
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _data_->_tmp5_ = boxes_installer_media_new_for_path_finish (_data_->_res_, &_data_->_inner_error_);
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _g_object_unref0 (_data_->_tmp0_);
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _data_->_tmp0_ = _data_->_tmp5_;
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                if (_data_->_inner_error_ != NULL) {
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                        g_simple_async_result_set_from_error (_data_->_async_result, _data_->_inner_error_);
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                        g_error_free (_data_->_inner_error_);
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                        _g_object_unref0 (_data_->_tmp0_);
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                        if (_data_->_state_ == 0) {
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                                g_simple_async_result_complete_in_idle (_data_->_async_result);
#line 673 "media-manager.c"
                        } else {
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                                g_simple_async_result_complete (_data_->_async_result);
#line 677 "media-manager.c"
                        }
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                        g_object_unref (_data_->_async_result);
#line 29 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                        return FALSE;
#line 683 "media-manager.c"
                }
        } else {
#line 30 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _data_->_tmp6_ = NULL;
#line 30 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _data_->_tmp6_ = _data_->path;
#line 30 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _data_->_tmp7_ = NULL;
#line 30 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _data_->_tmp7_ = boxes_installed_media_new (_data_->_tmp6_, &_data_->_inner_error_);
#line 30 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _g_object_unref0 (_data_->_tmp0_);
#line 30 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _data_->_tmp0_ = (BoxesInstallerMedia*) _data_->_tmp7_;
#line 30 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                if (_data_->_inner_error_ != NULL) {
#line 30 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                        g_simple_async_result_set_from_error (_data_->_async_result, _data_->_inner_error_);
#line 30 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                        g_error_free (_data_->_inner_error_);
#line 30 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                        _g_object_unref0 (_data_->_tmp0_);
#line 30 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                        if (_data_->_state_ == 0) {
#line 30 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                                g_simple_async_result_complete_in_idle (_data_->_async_result);
#line 710 "media-manager.c"
                        } else {
#line 30 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                                g_simple_async_result_complete (_data_->_async_result);
#line 714 "media-manager.c"
                        }
#line 30 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                        g_object_unref (_data_->_async_result);
#line 30 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                        return FALSE;
#line 720 "media-manager.c"
                }
        }
#line 28 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _data_->_tmp8_ = NULL;
#line 28 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _data_->_tmp8_ = _data_->_tmp0_;
#line 28 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _data_->_tmp9_ = NULL;
#line 28 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _data_->_tmp9_ = _g_object_ref0 (_data_->_tmp8_);
#line 28 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _data_->media = _data_->_tmp9_;
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _data_->_tmp11_ = NULL;
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _data_->_tmp11_ = _data_->media;
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _data_->_tmp12_ = NULL;
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _data_->_tmp12_ = boxes_media_manager_create_installer_media_from_media (_data_->self, _data_->_tmp11_, &_data_-
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _data_->_tmp10_ = _data_->_tmp12_;
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        if (_data_->_inner_error_ != NULL) {
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                g_simple_async_result_set_from_error (_data_->_async_result, _data_->_inner_error_);
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                g_error_free (_data_->_inner_error_);
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _g_object_unref0 (_data_->media);
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                _g_object_unref0 (_data_->_tmp0_);
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                if (_data_->_state_ == 0) {
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                        g_simple_async_result_complete_in_idle (_data_->_async_result);
#line 757 "media-manager.c"
                } else {
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                        g_simple_async_result_complete (_data_->_async_result);
#line 761 "media-manager.c"
                }
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                g_object_unref (_data_->_async_result);
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                return FALSE;
#line 767 "media-manager.c"
        }
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _data_->result = _data_->_tmp10_;
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _g_object_unref0 (_data_->media);
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _g_object_unref0 (_data_->_tmp0_);
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        if (_data_->_state_ == 0) {
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                g_simple_async_result_complete_in_idle (_data_->_async_result);
#line 779 "media-manager.c"
        } else {
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                g_simple_async_result_complete (_data_->_async_result);
#line 783 "media-manager.c"
        }
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        g_object_unref (_data_->_async_result);
#line 32 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        return FALSE;
#line 26 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _g_object_unref0 (_data_->media);
#line 26 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        _g_object_unref0 (_data_->_tmp0_);
#line 26 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        if (_data_->_state_ == 0) {
#line 26 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                g_simple_async_result_complete_in_idle (_data_->_async_result);
#line 797 "media-manager.c"
        } else {
#line 26 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
                g_simple_async_result_complete (_data_->_async_result);
#line 801 "media-manager.c"
        }
#line 26 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        g_object_unref (_data_->_async_result);
#line 26 "/extra-data/checkout/gnome/gnome-boxes/src/media-manager.vala"
        return FALSE;
#line 807 "media-manager.c"
}
Comment 3 Maciej (Matthew) Piechotka 2013-08-22 19:37:38 UTC
(In reply to comment #2)
> (In reply to comment #1)
> > I tried to run following sample and I could not reproduce it:
> > 
> > public async Object f() throws GLib.Error {
> >     throw new ThreadError.AGAIN ("Test");
> > }
> > 
> > public async Object g(bool b) throws GLib.Error {
> >     Object o = b ? yield f() : new Object ();
> >     return o;
> > }
> > 
> > public int main() {
> >     GLib.MainLoop loop = new GLib.MainLoop ();
> >     g.begin (true, (obj, res) => {
> >         try {
> >             g.end (res);
> >         } catch (GLib.Error e) {}
> >         loop.quit ();
> >     });
> >     loop.run ();
> >     return 0;
> > }
> 
> Could you try with only one of them being async (that one that get executed)?
> 

I'm sorry but I don't follow. g need to by async as it yields and f needs to be async as it is yielded. new Object is of course not async.
Comment 4 Zeeshan Ali 2013-08-22 22:55:37 UTC
(In reply to comment #3)
> (In reply to comment #2)
> > (In reply to comment #1)
> > > I tried to run following sample and I could not reproduce it:
> > > 
> > > public async Object f() throws GLib.Error {
> > >     throw new ThreadError.AGAIN ("Test");
> > > }
> > > 
> > > public async Object g(bool b) throws GLib.Error {
> > >     Object o = b ? yield f() : new Object ();
> > >     return o;
> > > }
> > > 
> > > public int main() {
> > >     GLib.MainLoop loop = new GLib.MainLoop ();
> > >     g.begin (true, (obj, res) => {
> > >         try {
> > >             g.end (res);
> > >         } catch (GLib.Error e) {}
> > >         loop.quit ();
> > >     });
> > >     loop.run ();
> > >     return 0;
> > > }
> > 
> > Could you try with only one of them being async (that one that get executed)?
> > 
> 
> I'm sorry but I don't follow. g need to by async as it yields and f needs to be
> async as it is yielded. new Object is of course not async.

Ah sorry, I misread.
Comment 5 GNOME Infrastructure Team 2018-05-22 14:55:33 UTC
-- GitLab Migration Automatic Message --

This bug has been migrated to GNOME's GitLab instance and has been closed from further activity.

You can subscribe and participate further through the new bug through this link to our GitLab instance: https://gitlab.gnome.org/GNOME/vala/issues/400.