* Fixing the panics occured when deleting ConditionVariables while still

holding the InterruptsSpinLocker.
* Have to use B_RELATIVE_TIMEOUT if you want to wait for a specific period.
  This fixes the problem of failing firmware loading in iprowifi2200 due to
  always timing out before the firmware would have had the chance to actually
  load.
* I can surf with iprowifi2200 now.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34410 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Colin Günther 2009-12-01 15:02:50 +00:00
parent 3c627a2751
commit aa068fb982
1 changed files with 5 additions and 3 deletions

View File

@ -56,9 +56,10 @@ init_condition_variables()
void
uninit_condition_variables()
{
InterruptsSpinLocker _(sConditionVariablesLock);
ConditionVariableHashDefinition definition;
InterruptsSpinLocker hashLocker(sConditionVariablesLock);
ConditionVariable* variable = sConditionVariableHash.Clear(true);
hashLocker.Unlock();
while (variable != NULL) {
ConditionVariable* next = definition.GetLink(variable);
@ -88,9 +89,10 @@ _cv_init(const void* object, const char* description)
void
_cv_destroy(const void* object)
{
InterruptsSpinLocker _(sConditionVariablesLock);
InterruptsSpinLocker hashLocker(sConditionVariablesLock);
ConditionVariable* conditionVariable
= sConditionVariableHash.Lookup(object);
hashLocker.Unlock();
if (conditionVariable == NULL)
return;
@ -114,7 +116,7 @@ _cv_timedwait_unlocked(const void* object, int timeout)
{
ConditionVariableEntry conditionVariableEntry;
status_t status = conditionVariableEntry.Wait(object, B_ABSOLUTE_TIMEOUT,
status_t status = conditionVariableEntry.Wait(object, B_RELATIVE_TIMEOUT,
ticks_to_usecs(timeout));
if (status == B_OK)