Fixes in BLooper and its tests.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@84 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
ejakowatz
2002-07-11 15:49:01 +00:00
parent 09cdca467d
commit 865f9d8e38
3 changed files with 38 additions and 12 deletions
+27 -11
View File
@@ -97,7 +97,7 @@ struct _loop_data_
//------------------------------------------------------------------------------
BLooper::BLooper(const char* name, int32 priority, int32 port_capacity)
: BHandler(name), fMsgPort(-1)
: BHandler(name)
{
InitData(name, priority, port_capacity);
}
@@ -275,7 +275,7 @@ bool BLooper::IsMessageWaiting() const
do
{
count = port_buffer_size_etc(fMsgPort, B_TIMEOUT, 0);
} while (count == B_WOULD_BLOCK);
} while (count == B_INTERRUPTED);
return count > 0;
}
@@ -302,7 +302,9 @@ void BLooper::AddHandler(BHandler* handler)
//------------------------------------------------------------------------------
bool BLooper::RemoveHandler(BHandler* handler)
{
AssertLocked();
// BeBook says looper must be locked for calls to this, but testing shows that
// just ain't so.
// AssertLocked();
// TODO: test
// Need to ensure this algo reflects what actually happens
@@ -633,7 +635,6 @@ bool BLooper::RemoveCommonFilter(BMessageFilter* filter)
//------------------------------------------------------------------------------
void BLooper::SetCommonFilterList(BList* filters)
{
AssertLocked();
if (fCommonFilters)
{
for (int32 i = 0; i < fCommonFilters->CountItems(); ++i)
@@ -885,6 +886,7 @@ void BLooper::InitData()
fPreferred = NULL;
fTaskID = B_ERROR;
fTerminating = false;
fMsgPort = -1;
if (sTeamID == -1)
{
@@ -893,22 +895,26 @@ void BLooper::InitData()
sTeamID = info.team;
}
BAutolock ListLock(sLooperListLock);
AddLooper(this);
Lock();
AddHandler(this);
}
//------------------------------------------------------------------------------
void BLooper::InitData(const char* name, int32 priority, int32 port_capacity)
{
InitData();
fLockSem = create_sem(1, name);
if (fMsgPort <= 0)
if (port_capacity <= 0)
{
fMsgPort = create_port(port_capacity, name ? name : "LooperPort");
port_capacity = B_LOOPER_PORT_DEFAULT_CAPACITY;
}
InitData();
fMsgPort = create_port(port_capacity, name ? name : "LooperPort");
fInitPriority = priority;
BAutolock ListLock(sLooperListLock);
AddLooper(this);
AddHandler(this);
}
//------------------------------------------------------------------------------
void BLooper::AddMessage(BMessage* msg)
@@ -1275,8 +1281,18 @@ DBG(OUT("BLooper::AddLooper(): looper added at %ld\n", looperCount));
result->looper = loop;
result->thread = loop->fTaskID;
++looperCount;
// Moved this here from InitData() because it occured to me that the
// looper could potentially get removed from the list between now
// and when we locked it in InitData(). By doing it here, while the
// the looper list is locked, we can be certain this won't happen.
loop->Lock();
}
}
else
{
debugger("sLooperList is not locked!");
}
}
//------------------------------------------------------------------------------
bool BLooper::IsLooperValid(const BLooper* l)
@@ -4,6 +4,7 @@
//------------------------------------------------------------------------------
// Standard Includes -----------------------------------------------------------
#include <iostream>
// System Includes -------------------------------------------------------------
#include <Looper.h>
@@ -17,13 +18,18 @@
// Local Defines ---------------------------------------------------------------
// Globals ---------------------------------------------------------------------
port_id _get_looper_port_(const BLooper* looper);
//------------------------------------------------------------------------------
//case 1: looper is unlocked and queue is empty
void TIsMessageWaitingTest::IsMessageWaiting1()
{
BLooper Looper;
#ifndef TEST_R5
assert(!Looper.IsMessageWaiting());
#else
assert(Looper.IsMessageWaiting());
#endif
}
//------------------------------------------------------------------------------
//case 2: looper is unlocked and queue is filled
@@ -39,7 +45,11 @@ void TIsMessageWaitingTest::IsMessageWaiting3()
{
BLooper Looper;
Looper.Lock();
#ifndef TEST_R5
assert(!Looper.IsMessageWaiting());
#else
assert(Looper.IsMessageWaiting());
#endif
}
//------------------------------------------------------------------------------
//case 4: looper is locked and queue is filled
@@ -36,7 +36,7 @@ void TRemoveHandlerTest::RemoveHandler1()
Handler.AddFilter(MessageFilter);
Looper.AddHandler(&Handler);
Looper.RemoveHandler(&Handler);
assert(Handler.FilterList() == NULL);
assert(Handler.FilterList());
}
//------------------------------------------------------------------------------
Test* TRemoveHandlerTest::Suite()