GNOME Bugzilla – Bug 706517
Crash on combining conditional epression with async construction
Last modified: 2018-05-22 14:55:33 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
+ Trace 232404
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); } -------------------------
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?
(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" }
(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.
(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.
-- 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.