> Date: Tue, 15 Dec 2020 12:15:30 -0300
> From: Martin Pieuchot <m...@openbsd.org>
> 
> When the first thread of multimedia/mpv exits after having played a video
> with the "gpu" (default) output, the programs receives a SIGSEV when it
> tries to execute one of its destructor:
> 
> void
> _rthread_tls_destructors(pthread_t thread)
> {
>       [...]
>         for (i = 0; i < PTHREAD_DESTRUCTOR_ITERATIONS; i++) {
>                 for (rs = thread->local_storage; rs; rs = rs->next) {
>                         if (!rs->data)
>                                 continue;
>                         if (rkeys[rs->keyid].destructor) {
>                                 void (*destructor)(void *) =
>                                     rkeys[rs->keyid].destructor;
>                                 void *data = rs->data;
>                                 rs->data = NULL;
>                                 _spinunlock(&rkeyslock);
>                                 destructor(data);             <-- HERE
>                                 _spinlock(&rkeyslock);
>                         }
>                 }
>         }
>       [...]
> }
> 
> This doesn't happen with other outputs and I haven't checked/don't know
> which piece of code in the "gpu" output calls pthread_key_create().
> 
> Full backtrace below.
> 
> $ mpv *.mp4
>  (+) Video --vid=1 (*) (h264 640x352 30.288fps)                        
>  (+) Audio --aid=1 (*) (aac 2ch 48000Hz)                                   
> libEGL warning: DRI3: Screen seems not DRI3 capable
> AO: [sdl] 48000Hz stereo 2ch s32                                              
>   
> VO: [gpu] 640x352 yuv420p                                                     
>   
> AV: 00:01:38 / 00:01:38 (100%) A-V:  0.000     
>                                                                               
>   
>                                                                               
>   
> Exiting... (End of file)                                                      
>   
> pthread_mutex_destroy on mutex with waiters!

> Segmentation fault (core dumped)

POSIX says:

  "Attempting to destroy a locked mutex, or a mutex that another
  thread is attempting to lock, or a mutex that is being used in a
  pthread_cond_timedwait() or pthread_cond_wait() call by another
  thread, results in undefined behavior."

Reply via email to