From aa068fb98273dbae3736b58c6de1cb41534a7cfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Colin=20G=C3=BCnther?= Date: Tue, 1 Dec 2009 15:02:50 +0000 Subject: [PATCH] * 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 --- src/libs/compat/freebsd_network/Condvar.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libs/compat/freebsd_network/Condvar.cpp b/src/libs/compat/freebsd_network/Condvar.cpp index 3673164162..81505ee405 100644 --- a/src/libs/compat/freebsd_network/Condvar.cpp +++ b/src/libs/compat/freebsd_network/Condvar.cpp @@ -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)