[Bug 283101] pthread_cancel() doesn't cancel a thread that's currently in pause()

[email protected] Sat, 21 Dec 2024 11:15:35 +0000
Newsgroups gmane.os.freebsd.devel.threading
Message-ID <[email protected]/bugzilla/>
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D283101

--- Comment #18 from [email protected] ---
(In reply to Konstantin Belousov from comment #17)

Your latest patch didn't apply over the previous one, so I git-checkout'd
first.

> PID 33078, iteration 340...pthread_cancel() succeeded
> OK
> Abort trap (core dumped)

I guess the abort() occurred at iteration 341, whose stdout wasn't flushed.

dmesg:
> pthread(pid 33078 uid 0) aborted: thr_in_critical %p(0x1fc231a12700)


(gdb) thread apply all bt full

Thread 2 (LWP 337498):
#0  _umtx_op_err () at /usr/src/lib/libthr/arch/amd64/amd64/_umtx_op_err.S:=
38
No locals.
#1  0x0000000821978d4b in _thr_umtx_wait (mtx=3D0x1fc231a12700, id=3D688152,
timeout=3D0x0) at /usr/src/lib/libthr/thread/thr_umtx.c:198
No locals.
#2  0x000000082196da7e in join_common (pthread=3D0x1fc231a12700,
thread_return=3D0x82043ebc0, abstime=3D0x0, peek=3D<optimized out>) at
/usr/src/lib/libthr/thread/thr_join.c:144
        __cup =3D {prev =3D 0x0, routine =3D 0x82196dbf0 <backout_join>, ro=
utine_arg
=3D 0x1fc231a12700, onheap =3D 0}
        ts =3D {tv_sec =3D 34901060464, tv_nsec =3D 34923276780}
        ts2 =3D {tv_sec =3D 0, tv_nsec =3D 34918916759552}
        curthread =3D 0x1fc231a12000
        ret =3D <optimized out>
        tid =3D 688152
        tsp =3D 0xa8018
        tmp =3D <optimized out>
#3  0x0000000000201aee in thread_cancel_and_join (ptid=3D0x1fc231a12700) at
pthread.c:28
        status =3D 0x0
        error =3D 0
#4  0x0000000000201a2c in main (argc=3D1, argv=3D0x82043ec98) at pthread.c:=
73
        ptid =3D 0x1fc231a12700
        err =3D 0
        iteration =3D 341
        pid =3D 33078

Thread 1 (LWP 688152):
#0  abort2 () at abort2.S:4
No locals.
#1  0x0000000821974b0e in sigcancel_handler (sig=3D<optimized out>,
info=3D<optimized out>, ucp=3D<optimized out>) at
/usr/src/lib/libthr/thread/thr_sig.c:198
        p =3D {0x1fc231a12700}
        curthread =3D 0x1fc231a12700
        err =3D <optimized out>
#2  <signal handler called>
No symbol table info available.
#3  _umtx_op_err () at /usr/src/lib/libthr/arch/amd64/amd64/_umtx_op_err.S:=
38
No locals.
#4  0x0000000821978a30 in __thr_umutex_lock (mtx=3D0x1fc231a12708, id=3D688=
152) at
/usr/src/lib/libthr/thread/thr_umtx.c:79
        owner =3D <optimized out>
#5  0x000000082196c30a in _thr_umutex_lock (mtx=3D0x1fc231a12708, id=3D17) =
at
/usr/src/lib/libthr/thread/thr_umtx.h:123
No locals.
#6  exit_thread () at /usr/src/lib/libthr/thread/thr_exit.c:301
        curthread =3D 0x1fc231a12700
#7  0x000000082196c1fe in _pthread_exit_mask (status=3Dstatus@entry=3D0x1,
mask=3Dmask@entry=3D0x0) at /usr/src/lib/libthr/thread/thr_exit.c:263
        curthread =3D 0x1fc231a12700
        cleanup =3D <optimized out>
#8  0x000000082196c06b in _Tthr_exit (status=3D0x1fc231a12708, status@entry=
=3D0x1)
at /usr/src/lib/libthr/thread/thr_exit.c:206
No locals.
#9  0x000000082196a400 in testcancel (curthread=3D<optimized out>) at
/usr/src/lib/libthr/thread/thr_cancel.c:51
No locals.
#10 _thr_cancel_enter (curthread=3Dcurthread@entry=3D0x1fc231a12700) at
/usr/src/lib/libthr/thread/thr_cancel.c:149
No locals.
#11 0x0000000821975002 in __thr_sigsuspend (set=3D0x822ca5f80) at
/usr/src/lib/libthr/thread/thr_sig.c:692
        newset =3D {__bits =3D {583688064, 8, 0, 0}}
        curthread =3D 0x1fc231a12700
        old =3D 0
        ret =3D <optimized out>
#12 0x0000000821fcea65 in __pause () at /usr/src/lib/libc/gen/pause.c:51
        oset =3D {__bits =3D {0, 0, 0, 0}}
#13 0x0000000000201a81 in thread (arg=3D0x0) at pthread.c:12
No locals.
#14 0x000000082196bb55 in thread_start (curthread=3D0x1fc231a12700) at
/usr/src/lib/libthr/thread/thr_create.c:289
        set =3D {__bits =3D {0, 0, 596938712, 8}}
#15 0x0000000000000000 in ?? ()


(gdb) frame 1
#1  0x0000000821974b0e in sigcancel_handler (sig=3D<optimized out>,
info=3D<optimized out>, ucp=3D<optimized out>) at
/usr/src/lib/libthr/thread/thr_sig.c:198
198                     abort2("thr_in_critical %p", 1, p);
(gdb) print *curthread
$1 =3D {tid =3D 688152, lock =3D {m_owner =3D 0, m_flags =3D 0, m_ceilings =
=3D {0, 0},
m_rb_lnk =3D 0, m_spare =3D {0, 0}}, cycle =3D 0, locklevel =3D 1, critical=
_count =3D 0,
sigblock =3D 0, fsigblock =3D 0, tle =3D {tqe_next =3D 0x1fc231a12000, tqe_=
prev =3D
0x82197c600 <_thread_list>}, gcle =3D {
    tqe_next =3D 0x0, tqe_prev =3D 0x0}, hle =3D {le_next =3D 0x0, le_prev =
=3D
0x82197ce68}, wle =3D {tqe_next =3D 0x0, tqe_prev =3D 0x0}, refcount =3D 1,
start_routine =3D 0x201a70 <thread>, arg =3D 0x0, attr =3D {sched_policy =
=3D 2,
sched_inherit =3D 4, prio =3D 0, suspend =3D 0, flags =3D 2,
    stackaddr_attr =3D 0x822aa6000, stacksize_attr =3D 2097152, guardsize_a=
ttr =3D
4096, cpuset =3D 0x0, cpusetsize =3D 0}, cancel_enable =3D 1, cancel_pendin=
g =3D 1,
cancel_point =3D 0, no_cancel =3D 1, cancel_async =3D 0, cancelling =3D 1, =
sigmask =3D
{__bits =3D {0, 0, 0, 0}},
  unblock_sigcancel =3D 0, in_sigsuspend =3D 1, deferred_siginfo =3D {si_si=
gno =3D 0,
si_errno =3D 0, si_code =3D 0, si_pid =3D 0, si_uid =3D 0, si_status =3D 0,=
 si_addr =3D
0x0, si_value =3D {sival_int =3D 0, sival_ptr =3D 0x0, sigval_int =3D 0, si=
gval_ptr =3D
0x0}, _reason =3D {_fault =3D {
        _trapno =3D 0}, _timer =3D {_timerid =3D 0, _overrun =3D 0}, _mesgq=
 =3D {_mqd =3D
0}, _poll =3D {_band =3D 0}, _capsicum =3D {_syscall =3D 0}, __spare__ =3D =
{__spare1__ =3D
0, __spare2__ =3D {0, 0, 0, 0, 0, 0, 0}}}}, deferred_sigmask =3D {__bits =
=3D {0, 0,
0, 0}}, deferred_sigact =3D {
    __sigaction_u =3D {__sa_handler =3D 0x0, __sa_sigaction =3D 0x0}, sa_fl=
ags =3D 0,
sa_mask =3D {__bits =3D {0, 0, 0, 0}}}, deferred_run =3D 0, force_exit =3D =
0, state =3D
PS_RUNNING, error =3D 0, joiner =3D 0x1fc231a12000, flags =3D 0, tlflags =
=3D 2, mq =3D
{{tqh_first =3D 0x0,
      tqh_last =3D 0x1fc231a128a8}, {tqh_first =3D 0x0, tqh_last =3D 0x1fc2=
31a128b8},
{tqh_first =3D 0x0, tqh_last =3D 0x1fc231a128c8}, {tqh_first =3D 0x0, tqh_l=
ast =3D
0x1fc231a128d8}, {tqh_first =3D 0x0, tqh_last =3D 0x1fc231a128e8}, {tqh_fir=
st =3D
0x0, tqh_last =3D 0x1fc231a128f8}},
  ret =3D 0x1, specific =3D 0x0, specific_data_count =3D 0, rdlock_count =
=3D 0,
rtld_bits =3D 0, tcb =3D 0x1fc232003120, cleanup =3D 0x0, ex =3D {exception=
_class =3D 0,
exception_cleanup =3D 0x0, private_1 =3D 0, private_2 =3D 0}, unwind_stacke=
nd =3D
0x822ca6000, unwind_disabled =3D 0,
  magic =3D 3499860245, report_events =3D 0, event_mask =3D 0, event_buf =
=3D {event =3D
TD_EVENT_NONE, th_p =3D 0, data =3D 0}, wchan =3D 0x0, mutex_obj =3D 0x0, w=
ill_sleep =3D
0, nwaiter_defer =3D 0, robust_inited =3D 0, robust_list =3D 0, priv_robust=
_list =3D 0,
inact_mtx =3D 0, defer_waiters =3D {
    0x0 <repeats 50 times>}, wake_addr =3D 0x1fc232000000, sleepqueue =3D
0x1fc231a19040, name =3D 0x0, dlerror_msg =3D "Undefined symbol
\"_Unwind_ForcedUnwind\"", '\000' <repeats 472 times>, dlerror_seen =3D 0}

--=20
You are receiving this mail because:
You are the assignee for the bug.=