tst-cond16 hang analysis
Jakub Jelinek
jakub at redhat.com
Thu May 20 08:58:17 UTC 2004
Hi!
This is posted mainly for archival purposes.
It describes what happens with NPTL CVS as of 2004-05-19 (i.e. after
broadcast_seq has been added; the analysis would be slightly different
before broadcast_seq has been introduced, but the hang has been there
as well (simply remove the b column, ", bc_seq = N" assignments,
++broadcast_seq line and bc_seq == broadcast_seq comparison).
thr1 thr2 thr3
pthread_mutex_lock (&m);
pthread_cond_wait (&c, &m);
pthread_mutex_lock (&m);
pthread_mutex_unlock (&m);
pthread_cond_broadcast (&c);
pthread_mutex_lock (&m);
pthread_cond_wait (&c);
pthread_mutex_lock &m);
pthread_cond_wait (&c, &m);
[ hang ]
# Normally following would happen afterwards:
pthread_mutex_unlock (&m);
pthread_mutex_lock (&m);
pthread_mutex_unlock (&m);
pthread_cond_broadcast (&c);
and the waiters would be awaken.
Detailed:
taob thread action
0000 1 locks m
0000 1 enters cond_wait
0000 1 locks c->__data.__lock
0000 1 unlocks m
1000 1 ++total_seq, thr1's seq = 0, bc_seq = 0
1000 1 unlocks c->__data.__lock
1000 2 locks m
1000 2 unlocks m
1000 2 enters cond_broadcast
1000 2 locks c->__data.__lock
1110 2 wakeup_seq = woken_seq = total_seq
1111 2 ++broadcast_seq
1111 2 unlocks c->__data.__lock
1111 3 locks m
1111 3 enters cond_wait
1111 3 locks c->__data.__lock
1111 3 unlocks m
2111 3 ++total_seq, thr3's seq = 1, bc_seq = 1
2111 3 unlocks c->__data.__lock
2111 3 futex_wait (&wakeup_seq)
2111 1 futex_wait (&wakeup_seq)
2111 2 futex_requeue
[ thr3 awaken, thr1 requeued to mutex ]
2111 3 locks c->__data.__lock
2111 3 bc_seq (1) == broadcast_seq, no early exit
2111 3 val = 1; val == seq (1), val (1) == woken_seq (1), therefore loop
2111 3 unlocks c->__data.__lock
2111 3 futex_wait (&wakeup_seq)
2111 2 locks m
[ note, m->__data.__lock went from 0 to 1 ]
2111 2 enters cond_wait
2111 2 locks c->__data.__lock
2111 2 unlocks m
[ note, m->__data.__lock went from 1 to 0, so thr1 has not been awaken ]
3111 2 ++total_seq, thr1's seq = 1, bc_seq = 1
3111 2 unlocks c->__data.__lock
3111 1 futex_wait (&wakeup_seq)
[ hang ]
Legend:
taob total_seq/wakeup_seq/woken_seq/broadcast_seq
Jakub
More information about the Phil-list
mailing list