[Bug 211947] bconsole won't die sitting on do_rw_wrlock
bugzilla-noreply at freebsd.org
bugzilla-noreply at freebsd.org
Tue Aug 23 21:20:48 UTC 2016
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=211947
--- Comment #2 from longwitz at incore.de ---
In the meantime I have extracted the pthread relevant parts of the program
bconsole and can give a working program thrtest.c that demonstrates the
problem:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static int global_ct = 0;
static pthread_mutex_t global_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_t work_thread;
void register_thread() {
pthread_mutex_lock(&global_mutex);
++global_ct;
pthread_mutex_unlock(&global_mutex);
}
void unregister_thread() {
pthread_mutex_lock(&global_mutex);
--global_ct;
pthread_mutex_unlock(&global_mutex);
}
void clean_handler(void *a) {
unregister_thread();
}
void *work_start(void *x) {
register_thread();
pthread_cleanup_push(clean_handler, NULL);
while (sleep(30))
getpid();
pthread_cleanup_pop(1);
exit(global_ct);
}
void cleanup_main() {
pthread_cancel(work_thread);
unregister_thread();
pthread_mutex_lock(&global_mutex);
getpid();
pthread_mutex_unlock(&global_mutex);
}
int main(int argc, char *argv[]) {
register_thread();
pthread_create(&work_thread, NULL, work_start, NULL);
getpid();
sleep(1);
cleanup_main();
exit(global_ct);
}
The relevant parts of ktrace output starting with sleep(1) from main():
83194 101055 thrtest 0.001482 CALL nanosleep(0x7fffdfffdf08,0x7fffdfffdef8)
83194 100732 thrtest 1.043574 RET nanosleep 0
83194 100732 thrtest 1.043602 CALL thr_kill(0x18abf,SIG 32)
83194 100732 thrtest 1.043617 RET thr_kill 0
83194 101055 thrtest 1.043624 RET nanosleep -1 errno 4 Interrupted system
call
83194 100732 thrtest 1.043625 CALL getpid
83194 101055 thrtest 1.043640 PSIG SIG 32 caught handler=0x80082d080
mask=0x0 code=SI_LWP
83194 100732 thrtest 1.043657 RET getpid 83194/0x144fa
83194 101055 thrtest 1.043676 CALL thr_wake(0x18abf)
83194 101055 thrtest 1.043686 RET thr_wake 0
83194 101055 thrtest 1.043691 CALL thr_wake(0x18abf)
83194 101055 thrtest 1.043696 RET thr_wake 0
83194 101055 thrtest 1.043701 CALL sigreturn(0x7fffdfffda70)
83194 101055 thrtest 1.043708 RET sigreturn JUSTRETURN
83194 101055 thrtest 1.043716 CALL
_umtx_op(0x800a42880,UMTX_OP_RW_RDLOCK,0,0,0)
83194 101055 thrtest 1.043723 RET _umtx_op 0
83194 100732 thrtest 1.043725 CALL
_umtx_op(0x800a42880,UMTX_OP_RW_WRLOCK,0,0,0)
83194 101055 thrtest 1.043743 CALL
_umtx_op(0x800a42880,UMTX_OP_RW_UNLOCK,0,0,0)
83194 101055 thrtest 1.043757 RET _umtx_op 0
83194 101055 thrtest 1.043762 CALL
_umtx_op(0x800a42880,UMTX_OP_RW_UNLOCK,0,0,0)
83194 101055 thrtest 1.043767 RET _umtx_op 0
83194 101055 thrtest 1.043771 CALL
_umtx_op(0x800a42880,UMTX_OP_RW_RDLOCK,0,0,0)
83194 100732 thrtest 1.043771 RET _umtx_op 0
83194 101055 thrtest 1.043779 RET _umtx_op -1 errno 4 Interrupted system
call
83194 100732 thrtest 1.043781 CALL
_umtx_op(0x800a42880,UMTX_OP_RW_UNLOCK,0,0,0)
83194 101055 thrtest 1.043785 CALL
_umtx_op(0x800a42880,UMTX_OP_RW_RDLOCK,0,0,0)
83194 100732 thrtest 1.043789 RET _umtx_op 0
83194 101055 thrtest 1.043792 RET _umtx_op 0
83194 100732 thrtest 1.043797 CALL
_umtx_op(0x800a42880,UMTX_OP_RW_WRLOCK,0,0,0)
83194 101055 thrtest 1.043800 CALL
_umtx_op(0x800a42880,UMTX_OP_RW_UNLOCK,0,0,0)
83194 101055 thrtest 1.043805 RET _umtx_op 0
83194 101055 thrtest 1.043811 CALL
_umtx_op(0x800a42880,UMTX_OP_RW_UNLOCK,0,0,0)
83194 101055 thrtest 1.043813 RET _umtx_op 0
83194 101055 thrtest 1.043816 CALL thr_exit(0x801406800)
Now the process 83194 hangs and procstat gives
PID TID COMM TDNAME KSTACK
83194 100732 thrtest - mi_switch+0xe1
sleepq_catch_signals+0xab sleepq_wait_sig+0xf _sleep+0x27d umtxq_sleep+0x125
do_rw_wrlock+0x5af __umtx_op_rw_wrlock+0x47 amd64_syscall+0x40f
Xfast_syscall+0xfb
PID TID COMM TDNAME CPU PRI STATE WCHAN
83194 100732 thrtest - 1 122 sleep uwrlck
Please can somebody verify this bug in FreeBSD 10.3 STABLE, my rev is 301633.
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the freebsd-threads
mailing list