* Make the wait object hash table larger than the maximum number of wait
objects we're going to add, so we get less slot collisions. * Use the "Unchecked" versions of the OpenHashTable Insert()/Remove() methods, since we have interrupts disabled. * Fixed wrong check that caused the wait object info events not to be filled in. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30384 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -260,7 +260,7 @@ SystemProfiler::SystemProfiler(team_id team, const area_info& userAreaInfo,
|
|||||||
// compute the number wait objects we want to cache
|
// compute the number wait objects we want to cache
|
||||||
if ((fFlags & B_SYSTEM_PROFILER_SCHEDULING_EVENTS) != 0) {
|
if ((fFlags & B_SYSTEM_PROFILER_SCHEDULING_EVENTS) != 0) {
|
||||||
fWaitObjectCount = parameters.locking_lookup_size
|
fWaitObjectCount = parameters.locking_lookup_size
|
||||||
/ (sizeof(WaitObject) + sizeof(void*));
|
/ (sizeof(WaitObject) + (sizeof(void*) * 3 / 2));
|
||||||
if (fWaitObjectCount < MIN_WAIT_OBJECT_COUNT)
|
if (fWaitObjectCount < MIN_WAIT_OBJECT_COUNT)
|
||||||
fWaitObjectCount = MIN_WAIT_OBJECT_COUNT;
|
fWaitObjectCount = MIN_WAIT_OBJECT_COUNT;
|
||||||
if (fWaitObjectCount > MAX_WAIT_OBJECT_COUNT)
|
if (fWaitObjectCount > MAX_WAIT_OBJECT_COUNT)
|
||||||
@@ -367,7 +367,7 @@ SystemProfiler::Init()
|
|||||||
for (int32 i = 0; i < fWaitObjectCount; i++)
|
for (int32 i = 0; i < fWaitObjectCount; i++)
|
||||||
fFreeWaitObjects.Add(fWaitObjectBuffer + i);
|
fFreeWaitObjects.Add(fWaitObjectBuffer + i);
|
||||||
|
|
||||||
error = fWaitObjectTable.Init(fWaitObjectCount);
|
error = fWaitObjectTable.Init(fWaitObjectCount * 3 / 2);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
@@ -893,7 +893,7 @@ SystemProfiler::_WaitObjectCreated(addr_t object, uint32 type)
|
|||||||
// but it makes sense, since we lazily track *used* wait objects only.
|
// but it makes sense, since we lazily track *used* wait objects only.
|
||||||
// I.e. the object in the table is now guaranteedly obsolete.
|
// I.e. the object in the table is now guaranteedly obsolete.
|
||||||
if (waitObject) {
|
if (waitObject) {
|
||||||
fWaitObjectTable.Remove(waitObject);
|
fWaitObjectTable.RemoveUnchecked(waitObject);
|
||||||
fUsedWaitObjects.Remove(waitObject);
|
fUsedWaitObjects.Remove(waitObject);
|
||||||
fFreeWaitObjects.Add(waitObject, false);
|
fFreeWaitObjects.Add(waitObject, false);
|
||||||
}
|
}
|
||||||
@@ -967,7 +967,7 @@ SystemProfiler::_WaitObjectUsed(addr_t object, uint32 type)
|
|||||||
= (system_profiler_wait_object_info*)
|
= (system_profiler_wait_object_info*)
|
||||||
_AllocateBuffer(sizeof(system_profiler_wait_object_info) + nameLen,
|
_AllocateBuffer(sizeof(system_profiler_wait_object_info) + nameLen,
|
||||||
B_SYSTEM_PROFILER_WAIT_OBJECT_INFO, 0, 0);
|
B_SYSTEM_PROFILER_WAIT_OBJECT_INFO, 0, 0);
|
||||||
if (event != NULL)
|
if (event == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
event->type = type;
|
event->type = type;
|
||||||
@@ -986,12 +986,12 @@ SystemProfiler::_WaitObjectUsed(addr_t object, uint32 type)
|
|||||||
waitObject = fFreeWaitObjects.RemoveHead();
|
waitObject = fFreeWaitObjects.RemoveHead();
|
||||||
if (waitObject == NULL) {
|
if (waitObject == NULL) {
|
||||||
waitObject = fUsedWaitObjects.RemoveHead();
|
waitObject = fUsedWaitObjects.RemoveHead();
|
||||||
fWaitObjectTable.Remove(waitObject);
|
fWaitObjectTable.RemoveUnchecked(waitObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
waitObject->object = object;
|
waitObject->object = object;
|
||||||
waitObject->type = type;
|
waitObject->type = type;
|
||||||
fWaitObjectTable.Insert(waitObject);
|
fWaitObjectTable.InsertUnchecked(waitObject);
|
||||||
fUsedWaitObjects.Add(waitObject);
|
fUsedWaitObjects.Add(waitObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user