* only delete the popupmenu if we running the async version of BPopUpMenu

This fixes part 3 of task #1987, TaskManager was using the syncronous version of
  of BPopUpMenu wrapped in it's own class to run asyncronous. It did set SetAsyncAutoDestruct
  to true and afterwards calling delete an the already deleted menu.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26406 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Karsten Heimrich
2008-07-13 20:42:14 +00:00
parent 49a22456dd
commit 99939029b3
+13 -13
View File
@@ -63,7 +63,7 @@ BPopUpMenu::~BPopUpMenu()
if (fTrackThread >= 0) {
status_t status;
while (wait_for_thread(fTrackThread, &status) == B_INTERRUPTED)
;
;
}
}
@@ -273,7 +273,7 @@ BPopUpMenu::_Go(BPoint where, bool autoInvoke, bool startOpened,
sem_id sem = create_sem(0, "window close lock");
if (sem < B_OK) {
delete data;
return NULL;
return NULL;
}
// Get a pointer to the window from which Go() was called
@@ -284,7 +284,7 @@ BPopUpMenu::_Go(BPoint where, bool autoInvoke, bool startOpened,
// and let BWindow block when needed
if (async && window != NULL) {
_set_menu_sem_(window, sem);
}
}
data->object = this;
data->autoInvoke = autoInvoke;
@@ -298,7 +298,7 @@ BPopUpMenu::_Go(BPoint where, bool autoInvoke, bool startOpened,
data->lock = sem;
// Spawn the tracking thread
fTrackThread = spawn_thread(_thread_entry, "popup", B_DISPLAY_PRIORITY, data);
fTrackThread = spawn_thread(_thread_entry, "popup", B_DISPLAY_PRIORITY, data);
if (fTrackThread < B_OK) {
// Something went wrong. Cleanup and return NULL
delete_sem(sem);
@@ -322,22 +322,22 @@ int32
BPopUpMenu::_thread_entry(void *arg)
{
popup_menu_data *data = static_cast<popup_menu_data *>(arg);
BPopUpMenu *menu = data->object;
BPopUpMenu *menu = data->object;
BRect *rect = NULL;
if (data->useRect)
rect = &data->rect;
data->selected = menu->_StartTrack(data->where, data->autoInvoke, data->startOpened, rect);
// Reset the window menu semaphore
// Reset the window menu semaphore
if (data->async && data->window)
_set_menu_sem_(data->window, B_BAD_SEM_ID);
delete_sem(data->lock);
// Commit suicide if needed
if (menu->fAutoDestruct) {
// Commit suicide if needed
if (data->async && menu->fAutoDestruct) {
menu->fTrackThread = -1;
delete menu;
}
@@ -388,13 +388,13 @@ BPopUpMenu::_WaitMenu(void *_data)
status_t unused;
while (wait_for_thread(fTrackThread, &unused) == B_INTERRUPTED)
;
fTrackThread = -1;
BMenuItem *selected = data->selected;
// data->selected is filled by the tracking thread
delete data;
return selected;
}