Partically backout previous commit. Since _callout_stop_safe() clears
out c->c_func, we can't take it after callout_stop(). To take it before we need to acquire callout_lock, to avoid race. This commit narrows down area where lock is held, but hack is still present. This should be redesigned. Approved by: julian (mentor)
This commit is contained in:
parent
6e91e74e11
commit
3eadb26df8
@ -3624,13 +3624,18 @@ ng_untimeout(struct callout *c, node_p node)
|
||||
{
|
||||
item_p item;
|
||||
int rval;
|
||||
void *c_func;
|
||||
|
||||
if (c == NULL)
|
||||
return (0);
|
||||
rval = callout_drain(c);
|
||||
/* there must be an official way to do this */
|
||||
mtx_lock_spin(&callout_lock);
|
||||
c_func = c->c_func;
|
||||
rval = callout_stop(c);
|
||||
mtx_unlock_spin(&callout_lock);
|
||||
item = c->c_arg;
|
||||
/* Do an extra check */
|
||||
if ((c->c_func == &ng_timeout_trapoline) &&
|
||||
if ((rval > 0) && (c_func == &ng_timeout_trapoline) &&
|
||||
(NGI_NODE(item) == node)) {
|
||||
/*
|
||||
* We successfully removed it from the queue before it ran
|
||||
|
Loading…
x
Reference in New Issue
Block a user