freebsd_network: Cleanup callout_thread.
* Reorganize inner loop for clarity and to reduce indentation. * Handle callouts that are due at this exact system_time. * "break" instead of "continue" if lock fails.
This commit is contained in:
@@ -52,45 +52,45 @@ callout_thread(void* /*data*/)
|
|||||||
if (c == NULL)
|
if (c == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (c->c_due < system_time()) {
|
if (c->c_due > system_time()) {
|
||||||
struct mtx *mutex = c->c_mtx;
|
|
||||||
|
|
||||||
// execute timer
|
|
||||||
list_remove_item(&sTimers, c);
|
|
||||||
if (mutex == NULL)
|
|
||||||
c->c_due = -1;
|
|
||||||
sCurrentCallout = c;
|
|
||||||
|
|
||||||
mutex_unlock(&sLock);
|
|
||||||
|
|
||||||
if (mutex != NULL) {
|
|
||||||
mtx_lock(mutex);
|
|
||||||
|
|
||||||
if (c->c_due < 0) {
|
|
||||||
mtx_unlock(mutex);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
c->c_due = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
c->c_func(c->c_arg);
|
|
||||||
|
|
||||||
if (mutex != NULL
|
|
||||||
&& (c->c_flags & CALLOUT_RETURNUNLOCKED) == 0)
|
|
||||||
mtx_unlock(mutex);
|
|
||||||
|
|
||||||
done:
|
|
||||||
if ((status = mutex_lock(&sLock)) != B_OK)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
sCurrentCallout = NULL;
|
|
||||||
c = NULL;
|
|
||||||
// restart scanning as we unlocked the list
|
|
||||||
} else {
|
|
||||||
// calculate new timeout
|
// calculate new timeout
|
||||||
if (c->c_due < timeout)
|
if (timeout > c->c_due)
|
||||||
timeout = c->c_due;
|
timeout = c->c_due;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// execute timer
|
||||||
|
list_remove_item(&sTimers, c);
|
||||||
|
struct mtx *c_mtx = c->c_mtx;
|
||||||
|
if (c_mtx == NULL)
|
||||||
|
c->c_due = -1;
|
||||||
|
sCurrentCallout = c;
|
||||||
|
|
||||||
|
mutex_unlock(&sLock);
|
||||||
|
|
||||||
|
if (c_mtx != NULL) {
|
||||||
|
mtx_lock(c_mtx);
|
||||||
|
|
||||||
|
if (c->c_due < 0) {
|
||||||
|
mtx_unlock(c_mtx);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
c->c_due = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
c->c_func(c->c_arg);
|
||||||
|
|
||||||
|
if (c_mtx != NULL
|
||||||
|
&& (c->c_flags & CALLOUT_RETURNUNLOCKED) == 0)
|
||||||
|
mtx_unlock(c_mtx);
|
||||||
|
|
||||||
|
done:
|
||||||
|
if ((status = mutex_lock(&sLock)) != B_OK)
|
||||||
|
break;
|
||||||
|
|
||||||
|
sCurrentCallout = NULL;
|
||||||
|
c = NULL;
|
||||||
|
// restart scanning as we unlocked the list
|
||||||
}
|
}
|
||||||
|
|
||||||
sTimeout = timeout;
|
sTimeout = timeout;
|
||||||
|
|||||||
Reference in New Issue
Block a user