* Getting rid of the necessity for cleaning up initialized ConditionalVariables

in uninit_condition_variables(). This method and its counterpart
  init_condition_variables() will be removed, once the need for the 
  sConditionVariableHash will be eliminated.
* Now every initialized  ConditionalVariable gets removed right after it is no  
  longer needed. Ingo what do you think?
* This behaviour matches with the FreeBSD way, where a conditional variable
  gets assigned to a sleepqueue only when needed, and is removed from that
  sleepqueue the moment the condition is met.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34427 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Colin Günther
2009-12-01 18:48:54 +00:00
parent 4ae9d7d044
commit 56c28b450f
3 changed files with 11 additions and 16 deletions
+1 -14
View File
@@ -54,20 +54,7 @@ init_condition_variables()
void
uninit_condition_variables()
{
ConditionVariableHashDefinition definition;
InterruptsSpinLocker hashLocker(sConditionVariablesLock);
ConditionVariable* variable = sConditionVariableHash.Clear(true);
hashLocker.Unlock();
while (variable != NULL) {
ConditionVariable* next = definition.GetLink(variable);
variable->Unpublish();
delete variable;
variable = next;
}
}
uninit_condition_variables() {}
} /* extern "C" */
@@ -10,7 +10,7 @@
struct cv {
int dummy;
const char* description;
};
+9 -1
View File
@@ -12,7 +12,7 @@
void cv_init(struct cv* conditionVariable, const char* description)
{
_cv_init(conditionVariable, description);
conditionVariable->description = description;
}
@@ -26,17 +26,25 @@ int cv_timedwait(struct cv* conditionVariable, struct mtx* mutex, int timeout)
{
int status;
_cv_init(conditionVariable, conditionVariable->description);
mtx_unlock(mutex);
status = _cv_timedwait_unlocked(conditionVariable, timeout);
mtx_lock(mutex);
_cv_destroy(conditionVariable);
return status;
}
void cv_wait(struct cv* conditionVariable, struct mtx* mutex)
{
_cv_init(conditionVariable, conditionVariable->description);
mtx_unlock(mutex);
_cv_wait_unlocked(conditionVariable);
mtx_lock(mutex);
_cv_destroy(conditionVariable);
}