Revert Interface Kit: BWindow owns (and deletes) menu sem and friends

This reverts commits:
39083dd0f7
0f430ba35c
ac55439364

Fixes #19553

Change-Id: I40f9a694079d4376221099e1d1b99208aeb207b7
Reviewed-on: https://review.haiku-os.org/c/haiku/+/9416
Reviewed-by: waddlesplash <[email protected]>
Tested-by: Commit checker robot <[email protected]>
This commit is contained in:
John Scipione
2025-06-30 17:43:51 +00:00
committed by waddlesplash
parent b515400884
commit e362f604f4
4 changed files with 17 additions and 26 deletions
+1 -1
View File
@@ -106,7 +106,7 @@ private:
menu_bar_border fBorder; menu_bar_border fBorder;
thread_id fTrackingPID; thread_id fTrackingPID;
int32 fPrevFocusToken; int32 fPrevFocusToken;
uint32 _reserved1; sem_id fMenuSem;
BRect* fLastBounds; BRect* fLastBounds;
uint32 fBorders; uint32 fBorders;
uint32 _reserved[1]; uint32 _reserved[1];
+9 -2
View File
@@ -52,6 +52,7 @@ BMenuBar::BMenuBar(BRect frame, const char* name, uint32 resizingMode,
fBorder(B_BORDER_FRAME), fBorder(B_BORDER_FRAME),
fTrackingPID(-1), fTrackingPID(-1),
fPrevFocusToken(-1), fPrevFocusToken(-1),
fMenuSem(-1),
fLastBounds(NULL), fLastBounds(NULL),
fTracking(false) fTracking(false)
{ {
@@ -67,6 +68,7 @@ BMenuBar::BMenuBar(const char* name, menu_layout layout, uint32 flags)
fBorder(B_BORDER_FRAME), fBorder(B_BORDER_FRAME),
fTrackingPID(-1), fTrackingPID(-1),
fPrevFocusToken(-1), fPrevFocusToken(-1),
fMenuSem(-1),
fLastBounds(NULL), fLastBounds(NULL),
fTracking(false) fTracking(false)
{ {
@@ -80,6 +82,7 @@ BMenuBar::BMenuBar(BMessage* archive)
fBorder(B_BORDER_FRAME), fBorder(B_BORDER_FRAME),
fTrackingPID(-1), fTrackingPID(-1),
fPrevFocusToken(-1), fPrevFocusToken(-1),
fMenuSem(-1),
fLastBounds(NULL), fLastBounds(NULL),
fTracking(false) fTracking(false)
{ {
@@ -489,8 +492,9 @@ BMenuBar::StartMenuBar(int32 menuIndex, bool sticky, bool showMenu,
// so let's call MenusBeginning() directly // so let's call MenusBeginning() directly
window->MenusBeginning(); window->MenusBeginning();
sem_id sem = create_sem(0, "window close sem"); fMenuSem = create_sem(0, "window close sem");
_set_menu_sem_(window, sem); _set_menu_sem_(window, fMenuSem);
fTrackingPID = spawn_thread(_TrackTask, "menu_tracking", B_DISPLAY_PRIORITY, NULL); fTrackingPID = spawn_thread(_TrackTask, "menu_tracking", B_DISPLAY_PRIORITY, NULL);
if (fTrackingPID >= 0) { if (fTrackingPID >= 0) {
menubar_data data; menubar_data data;
@@ -507,6 +511,7 @@ BMenuBar::StartMenuBar(int32 menuIndex, bool sticky, bool showMenu,
} else { } else {
fTracking = false; fTracking = false;
_set_menu_sem_(window, B_NO_MORE_SEMS); _set_menu_sem_(window, B_NO_MORE_SEMS);
delete_sem(fMenuSem);
} }
} }
@@ -534,6 +539,8 @@ BMenuBar::_TrackTask(void* arg)
window->PostMessage(_MENUS_DONE_); window->PostMessage(_MENUS_DONE_);
_set_menu_sem_(window, B_BAD_SEM_ID); _set_menu_sem_(window, B_BAD_SEM_ID);
delete_sem(menuBar->fMenuSem);
menuBar->fMenuSem = B_BAD_SEM_ID;
return 0; return 0;
} }
+5 -6
View File
@@ -370,6 +370,7 @@ BPopUpMenu::_Go(BPoint where, bool autoInvoke, bool startOpened,
fTrackThread = spawn_thread(_thread_entry, "popup", B_DISPLAY_PRIORITY, data); fTrackThread = spawn_thread(_thread_entry, "popup", B_DISPLAY_PRIORITY, data);
if (fTrackThread < B_OK) { if (fTrackThread < B_OK) {
// Something went wrong. Cleanup and return NULL // Something went wrong. Cleanup and return NULL
delete_sem(sem);
if (async && window != NULL) if (async && window != NULL)
_set_menu_sem_(window, B_BAD_SEM_ID); _set_menu_sem_(window, B_BAD_SEM_ID);
delete data; delete data;
@@ -403,6 +404,8 @@ BPopUpMenu::_thread_entry(void* menuData)
if (data->async && data->window) if (data->async && data->window)
_set_menu_sem_(data->window, B_BAD_SEM_ID); _set_menu_sem_(data->window, B_BAD_SEM_ID);
delete_sem(data->lock);
// Commit suicide if needed // Commit suicide if needed
if (data->async && menu->fAutoDestruct) { if (data->async && menu->fAutoDestruct) {
menu->fTrackThread = -1; menu->fTrackThread = -1;
@@ -459,12 +462,8 @@ BPopUpMenu::_WaitMenu(void* _data)
BWindow* window = data->window; BWindow* window = data->window;
sem_id sem = data->lock; sem_id sem = data->lock;
if (window != NULL) { if (window != NULL) {
status_t err; while (acquire_sem_etc(sem, 1, B_RELATIVE_TIMEOUT, 50000) != B_BAD_SEM_ID)
do { window->UpdateIfNeeded();
err = acquire_sem_etc(sem, 1, B_RELATIVE_TIMEOUT, 50000);
} while (err == B_INTERRUPTED);
window->UpdateIfNeeded();
} }
status_t unused; status_t unused;
+2 -17
View File
@@ -217,23 +217,8 @@ static value_info sWindowValueInfo[] = {
void void
_set_menu_sem_(BWindow* window, sem_id sem) _set_menu_sem_(BWindow* window, sem_id sem)
{ {
if (window == NULL) if (window != NULL)
return; window->fMenuSem = sem;
// delete semaphore when set to invalid
switch (sem) {
case B_BAD_SEM_ID:
case B_NO_MORE_SEMS:
case -1:
if (window->fMenuSem > 0)
delete_sem(window->fMenuSem);
break;
default:
break;
}
window->fMenuSem = sem;
} }