From f04c36cae914329d729b2fbf33417efa96c21c2c Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Sun, 10 Jun 2012 11:56:22 -0700 Subject: [PATCH] Timeline: Prevent segfault at shut down due to OSC output thread left running. --- timeline/src/OSC_Thread.C | 21 +++++++++++++++++++-- timeline/src/OSC_Thread.H | 4 ++++ timeline/src/Timeline.C | 17 +++++++++++++---- timeline/src/Timeline.H | 2 ++ 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/timeline/src/OSC_Thread.C b/timeline/src/OSC_Thread.C index be6e074..a04aa81 100644 --- a/timeline/src/OSC_Thread.C +++ b/timeline/src/OSC_Thread.C @@ -24,16 +24,23 @@ #include #include +#include "debug.h" + extern Timeline *timeline; OSC_Thread::OSC_Thread ( ) { // _thread.init(); + _shutdown = false; } OSC_Thread::~OSC_Thread ( ) { - + if ( _shutdown == false ) + { + _shutdown = true; + _thread.join(); + } } void @@ -42,17 +49,27 @@ OSC_Thread::start ( ) _thread.clone( &OSC_Thread::process, this ); } +void +OSC_Thread::join ( ) +{ + _thread.join(); +} + void OSC_Thread::process ( void ) { _thread.name( "OSC" ); - for ( ;; ) + DMESSAGE( "OSC Thread starting" ); + + while ( !_shutdown ) { usleep( 100 * 1000 ); timeline->process_osc(); } + + DMESSAGE( "OSC Thread stopping." ); } void * diff --git a/timeline/src/OSC_Thread.H b/timeline/src/OSC_Thread.H index d75991d..d678028 100644 --- a/timeline/src/OSC_Thread.H +++ b/timeline/src/OSC_Thread.H @@ -26,12 +26,16 @@ class OSC_Thread : public Mutex { Thread _thread; /* io thread */ + volatile bool _shutdown; + public: OSC_Thread ( ); virtual ~OSC_Thread ( ); + void join ( void ); + void shutdown ( void ) { _shutdown = true; } void start ( void ); void process ( void ); static void *process ( void * ); diff --git a/timeline/src/Timeline.C b/timeline/src/Timeline.C index 342f709..737e07c 100644 --- a/timeline/src/Timeline.C +++ b/timeline/src/Timeline.C @@ -398,6 +398,12 @@ Timeline::ntracks ( void ) const } +Timeline::~Timeline ( ) +{ + delete osc_thread; + osc_thread = 0; +} + Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : BASE( X, Y, W, H, L ) { Loggable::snapshot_callback( &Timeline::snapshot, this ); @@ -1698,13 +1704,16 @@ Timeline::process_osc ( void ) { Track *t = (Track*)tracks->child( i ); - for ( int j = t->control->children(); j--; ) + if ( t->control ) { - Control_Sequence *c = (Control_Sequence*)t->control->child( j ); - c->process_osc(); + for ( int j = t->control->children(); j--; ) + { + Control_Sequence *c = (Control_Sequence*)t->control->child( j ); + c->process_osc(); + } } } - + unlock(); } diff --git a/timeline/src/Timeline.H b/timeline/src/Timeline.H index 756661e..48de0d2 100644 --- a/timeline/src/Timeline.H +++ b/timeline/src/Timeline.H @@ -163,6 +163,8 @@ public: nframes_t _sample_rate; Timeline ( int X, int Y, int W, int H, const char *L=0 ); + + virtual ~Timeline ( ); void update_tempomap ( void );