The monitor watcher list was not locked when broadcast a message.
Probably it caused #4151 git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31982 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
c08c945ff3
commit
b2cdb463b3
|
@ -21,6 +21,7 @@ Monitor::~Monitor()
|
|||
status_t
|
||||
Monitor::StartWatching(BHandler* target)
|
||||
{
|
||||
BAutolock autolock(fListLocker);
|
||||
if (fWatcherList.HasItem(target))
|
||||
return B_ERROR;
|
||||
|
||||
|
@ -32,6 +33,7 @@ Monitor::StartWatching(BHandler* target)
|
|||
status_t
|
||||
Monitor::StopWatching(BHandler* target)
|
||||
{
|
||||
BAutolock autolock(fListLocker);
|
||||
return fWatcherList.RemoveItem(target);
|
||||
}
|
||||
|
||||
|
@ -64,8 +66,6 @@ PowerStatusDriverInterface::~PowerStatusDriverInterface()
|
|||
status_t
|
||||
PowerStatusDriverInterface::StartWatching(BHandler* target)
|
||||
{
|
||||
BAutolock autolock(fListLocker);
|
||||
|
||||
status_t status = Monitor::StartWatching(target);
|
||||
|
||||
if (status != B_OK)
|
||||
|
@ -95,8 +95,6 @@ PowerStatusDriverInterface::StartWatching(BHandler* target)
|
|||
status_t
|
||||
PowerStatusDriverInterface::StopWatching(BHandler* target)
|
||||
{
|
||||
BAutolock autolock(fListLocker);
|
||||
|
||||
if (fThreadId < 0)
|
||||
return B_BAD_VALUE;
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@ public:
|
|||
virtual void Broadcast(uint32 message);
|
||||
|
||||
protected:
|
||||
BLocker fListLocker;
|
||||
WatcherList fWatcherList;
|
||||
|
||||
};
|
||||
|
@ -72,8 +73,6 @@ private:
|
|||
static int32 _ThreadWatchPowerFunction(void* data);
|
||||
|
||||
thread_id fThreadId;
|
||||
|
||||
BLocker fListLocker;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -400,7 +400,7 @@ PowerStatusReplicant::PowerStatusReplicant(BMessage* archive)
|
|||
|
||||
PowerStatusReplicant::~PowerStatusReplicant()
|
||||
{
|
||||
if (fExtWindowMessenger)
|
||||
if (fMessengerExist)
|
||||
delete fExtWindowMessenger;
|
||||
|
||||
fDriverInterface->StopWatching(this);
|
||||
|
@ -536,6 +536,7 @@ PowerStatusReplicant::_Init()
|
|||
}
|
||||
|
||||
fExtendedWindow = NULL;
|
||||
fMessengerExist = false;
|
||||
fExtWindowMessenger = NULL;
|
||||
|
||||
fDriverInterface->StartWatching(this);
|
||||
|
@ -566,7 +567,10 @@ PowerStatusReplicant::_OpenExtendedWindow()
|
|||
msg.AddSpecifier("Hidden", int32(0));
|
||||
if (fExtWindowMessenger->SendMessage(&msg) == B_BAD_PORT_ID) {
|
||||
fExtendedWindow = new ExtendedInfoWindow(fDriverInterface);
|
||||
if (fMessengerExist)
|
||||
delete fExtWindowMessenger;
|
||||
fExtWindowMessenger = new BMessenger(NULL, fExtendedWindow);
|
||||
fMessengerExist = true;
|
||||
fExtendedWindow->Show();
|
||||
}
|
||||
else
|
||||
|
|
|
@ -86,6 +86,7 @@ class PowerStatusReplicant : public PowerStatusView
|
|||
void _OpenExtendedWindow();
|
||||
|
||||
BWindow* fExtendedWindow;
|
||||
bool fMessengerExist;
|
||||
BMessenger* fExtWindowMessenger;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue