On 2022-02-06 22:50:07 +0400 Fred Kiefer <fredkie...@gmx.de> wrote:
Your change looks great to me, as always. Let's just hope it does not
break
anything for the other two issues that caused the different changes
on that
code.
That one issue in December was due to deallocation of NSPopUpButtonCell
causing to call -[synchronizeTitleAndSelectedItem] followed with
updating
of the _menuItem, its _menu and all dependants (validators) where
the segfault occurs because one of the validators has been deallocated
already.
#0 0x00007ffff6ee9415 in objc_msg_lookup () from
/usr/lib/x86_64-linux-gnu/libobjc.so.4
#1 0x00007ffff7845af0 in -[NSApplication targetForAction:to:from:]
(self=0x5555559683a0, _cmd=0x7ffff7c72330 <_OBJC_SELECTOR_TABLE+2384>,
theAction=0x555555ad8570, theTarget=0x555555e464b0,
sender=0x555555d1feb0) at NSApplication.m:2294
#2 0x00007ffff7949ca8 in -[NSMenu _autoenableItem:]
(self=0x555555d1fa40, _cmd=0x7ffff7c723f0 <_OBJC_SELECTOR_TABLE+2576>,
item=0x555555d1feb0) at NSMenu.m:1184
#3 0x00007ffff794a078 in -[NSMenu update] (self=0x555555d1fa40,
_cmd=0x7ffff7c721a0 <_OBJC_SELECTOR_TABLE+1984>) at NSMenu.m:1260
#4 0x00007ffff7948f56 in -[NSMenu itemChanged:] (self=0x555555d1fa40,
_cmd=0x7ffff7c79650 <_OBJC_SELECTOR_TABLE+496>,
anObject=0x555555d1fdd0) at NSMenu.m:878
#5 0x00007ffff7957bdd in -[NSMenuItem setImage:]
(self=0x555555d1fdd0, _cmd=0x7ffff7c98cf0 <_OBJC_SELECTOR_TABLE+1168>,
image=0x0)
at NSMenuItem.m:375
#6 0x00007ffff797c589 in -[NSPopUpButtonCell setMenuItem:]
(self=0x555555d1fc60, _cmd=0x7ffff7c98da0 <_OBJC_SELECTOR_TABLE+1344>,
item=0x0)
at NSPopUpButtonCell.m:652
#7 0x00007ffff797cf77 in -[NSPopUpButtonCell
synchronizeTitleAndSelectedItem] (self=0x555555d1fc60,
_cmd=0x7ffff7c98ac0 <_OBJC_SELECTOR_TABLE+608>) at
NSPopUpButtonCell.m:854
#8 0x00007ffff797b631 in -[NSPopUpButtonCell setMenu:]
(self=0x555555d1fc60, _cmd=0x7ffff7c98940 <_OBJC_SELECTOR_TABLE+224>,
menu=0x0)
at NSPopUpButtonCell.m:218
#9 0x00007ffff797b284 in -[NSPopUpButtonCell dealloc]
(self=0x555555d1fc60, _cmd=0x7ffff7534970 <_OBJC_SELECTOR_TABLE+48>)
at NSPopUpButtonCell.m:153
May be doing that is excessive in the context of deallocation?
The attached patch changes the -[dealloc] to do the code chunk
equivalent to -[setMenu:nil]
avoiding that -[NSPopUpButtonCell synchronizeTitleAndSelectedItem] and
following.
--
SG
<gtam_segfault_on_quit_bug.patch>
diff --git a/Source/NSPopUpButtonCell.m b/Source/NSPopUpButtonCell.m
index a60a0ca4d..53bb39aae 100644
--- a/Source/NSPopUpButtonCell.m
+++ b/Source/NSPopUpButtonCell.m
@@ -138,6 +138,7 @@ static NSImage *_pbc_image[5];
- (void) dealloc
{
+ NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
/*
* The popup must be closed here, just in case the cell goes away
* while the popup is still displayed. In that case the notification
@@ -150,7 +151,11 @@ static NSImage *_pbc_image[5];
if (_menu != nil)
{
- [self setMenu: nil];
+ [_menu _setOwnedByPopUp: nil];
+ [nc removeObserver: self
+ name: nil
+ object: _menu];
+ [self setMenuView: nil];
}
_selectedItem = nil;
[super dealloc];