Skip to content

Commit

Permalink
Prevent crash on exit.
Browse files Browse the repository at this point in the history
Calling pthread_cancel( NULL ) results in the same crash as calling
pthread_join( NULL, ... )

This fixes the following:

  Start obecli.
  obecli> set input decklink
  obecli> set input opts card-idx=0
  obecli> probe input
  Probing device: Decklink card 0. Timeout 20 seconds
  Detected input streams:
  Input-stream-id: 0 - Video: RAW 720x576i 25/1fps
  Input-stream-id: 1 - Audio: PCM 16 channels 48kHz
  Encoder outputs:
  Output-stream-id: 0 - Input-stream-id: 0 - Video: AVC
  Output-stream-id: 1 - Input-stream-id: 1 - Audio: RAW - SDI audio pair: 1
  obecli> quit
  closing obe
  Program received signal SIGSEGV, Segmentation fault.
  0x00007ffff6675be1 in pthread_cancel () from /lib64/libpthread.so.0
  (gdb) bt
  #0  0x00007ffff6675be1 in pthread_cancel () from /lib64/libpthread.so.0
  ob-encoder#1  0x00000000004483d1 in obe_close (h=0x1417860) at obe.c:1233
  ob-encoder#2  0x000000000044433f in stop_encode (command=command@entry=0x0, child=child@entry=0x0) at obecli.c:1353
  ob-encoder#3  0x0000000000446d92 in main (argc=<optimized out>, argv=<optimized out>) at obecli.c:1534
  • Loading branch information
Georgi Chorbadzhiyski committed Oct 29, 2013
1 parent 5f44c3a commit eaf6234
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions obe.c
Original file line number Diff line number Diff line change
Expand Up @@ -559,6 +559,13 @@ static int obe_validate_input_params( obe_input_t *input_device )
return 0;
}

static int __pthread_cancel( pthread_t thread )
{
if ( thread )
return pthread_cancel( thread );
return -1;
}

static int __pthread_join( pthread_t thread, void **retval )
{
if ( thread )
Expand Down Expand Up @@ -665,7 +672,7 @@ int obe_probe_device( obe_t *h, obe_input_t *input_device, obe_input_program_t *
break;
}

pthread_cancel( thread );
__pthread_cancel( thread );
__pthread_join( thread, &ret_ptr );

cur_devices = h->num_devices;
Expand Down Expand Up @@ -1230,7 +1237,7 @@ void obe_close( obe_t *h )
/* Cancel input thread */
for( int i = 0; i < h->num_devices; i++ )
{
pthread_cancel( h->devices[i]->device_thread );
__pthread_cancel( h->devices[i]->device_thread );
__pthread_join( h->devices[i]->device_thread, &ret_ptr );
}

Expand Down Expand Up @@ -1304,7 +1311,7 @@ void obe_close( obe_t *h )
pthread_mutex_unlock( &h->outputs[i]->queue.mutex );
__pthread_join( h->outputs[i]->output_thread, &ret_ptr );
/* could be blocking on OS so have to cancel thread too */
pthread_cancel( h->outputs[i]->output_thread );
__pthread_cancel( h->outputs[i]->output_thread );
__pthread_join( h->outputs[i]->output_thread, &ret_ptr );
}

Expand Down

0 comments on commit eaf6234

Please sign in to comment.