Fix subtle race in threads test case
The call to wake_up() must be moved under the spin lock because once we drop the lock 'tp' may no longer be valid because the creating thread has exited. This basic thread implementation was correct, this was simply a flaw in the test case.
This commit is contained in:
parent
5be4767ae1
commit
616df2dd8b
|
@ -67,9 +67,9 @@ splat_thread_work1(void *priv)
|
||||||
spin_lock(&tp->tp_lock);
|
spin_lock(&tp->tp_lock);
|
||||||
ASSERT(tp->tp_magic == SPLAT_THREAD_TEST_MAGIC);
|
ASSERT(tp->tp_magic == SPLAT_THREAD_TEST_MAGIC);
|
||||||
tp->tp_rc = 1;
|
tp->tp_rc = 1;
|
||||||
|
wake_up(&tp->tp_waitq);
|
||||||
spin_unlock(&tp->tp_lock);
|
spin_unlock(&tp->tp_lock);
|
||||||
|
|
||||||
wake_up(&tp->tp_waitq);
|
|
||||||
thread_exit();
|
thread_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,18 +108,17 @@ splat_thread_work2(void *priv)
|
||||||
spin_lock(&tp->tp_lock);
|
spin_lock(&tp->tp_lock);
|
||||||
ASSERT(tp->tp_magic == SPLAT_THREAD_TEST_MAGIC);
|
ASSERT(tp->tp_magic == SPLAT_THREAD_TEST_MAGIC);
|
||||||
tp->tp_rc = 1;
|
tp->tp_rc = 1;
|
||||||
|
wake_up(&tp->tp_waitq);
|
||||||
spin_unlock(&tp->tp_lock);
|
spin_unlock(&tp->tp_lock);
|
||||||
|
|
||||||
wake_up(&tp->tp_waitq);
|
|
||||||
thread_exit();
|
thread_exit();
|
||||||
|
|
||||||
/* The following code is unreachable when thread_exit() is
|
/* The following code is unreachable when thread_exit() is
|
||||||
* working properly, which is exactly what we're testing */
|
* working properly, which is exactly what we're testing */
|
||||||
spin_lock(&tp->tp_lock);
|
spin_lock(&tp->tp_lock);
|
||||||
tp->tp_rc = 2;
|
tp->tp_rc = 2;
|
||||||
spin_unlock(&tp->tp_lock);
|
|
||||||
|
|
||||||
wake_up(&tp->tp_waitq);
|
wake_up(&tp->tp_waitq);
|
||||||
|
spin_unlock(&tp->tp_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
Loading…
Reference in New Issue