Date: Tue, 8 Apr 2014 08:34:30 +0200 From: =?iso-8859-2?Q?Edward_Tomasz_Napiera=B3a?= <trasz@FreeBSD.org> To: hackers@freebsd.org Subject: Multiple locks and missing wakeup. Message-ID: <0D69A6A8-43D1-41FB-8C2D-00F5CAD9C86E@FreeBSD.org>
next in thread | raw e-mail | index | archive | help
Let's say I have a kernel thread processing elements from a queue,
sleeping until there is work to do; something like this:
mtx_lock(&mtx1);
for (;;) {
while (!LIST_EMPTY(&list1)) {
elt = LIST_FIRST(&list1);
do_stuff(elt);
LIST_REMOVE(&list1, elt);
}
sleep(&list1, &mtx1);
}
mtx_unlock(&mtx1);
Now, is there some way to make it work with two lists, protected
by different mutexes? The mutex part is crucial here; the whole
point of this is to reduce lock contention on one of the lists. The
following code would result in a missing wakeup:
mtx_lock(&mtx1);
for (;;) {
while (!LIST_EMPTY(&list1)) {
elt = LIST_FIRST(&list1);
do_stuff(elt);
LIST_REMOVE(&list1, elt);
}
mtx_lock(&mtx2);
while (!LIST_EMPTY(&list2)) {
elt = LIST_FIRST(&list2);
do_other_stuff(elt);
LIST_REMOVE(&list2, elt);
}
mtx_unlock(&mtx2);
sleep(&list1, &mtx1);
}
mtx_unlock(&mtx1);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?0D69A6A8-43D1-41FB-8C2D-00F5CAD9C86E>
