Hi, The attached patch fixes a crash which occurs on exit.
In the FGMetarEnvironmentCtrl destructor, thread->cancel() causes the following thread->join() call to return without actually waiting on the thread (btw, thread->cancel() does not cause the thread to exit). Then the request_queue destructor is automatically invoked, but the metar thread is still waiting on fetcher->request_queue.pop(), with the SGBlockingQueue lock held. Destroying the locked mutex causes the crash: Assertion failed: (status == 0), function ~SGMutex, file /home/jylefort/test/simgear-head/include/simgear/threads/SGThread.hxx, line 227. Abort trap (core dumped) -- Jean-Yves Lefort [EMAIL PROTECTED] http://lefort.be.eu.org/
Index: src/Environment/environment_ctrl.cxx =================================================================== RCS file: /var/cvs/FlightGear-0.9/source/src/Environment/environment_ctrl.cxx,v retrieving revision 1.45 diff -u -r1.45 environment_ctrl.cxx --- src/Environment/environment_ctrl.cxx 21 Feb 2006 13:19:33 -0000 1.45 +++ src/Environment/environment_ctrl.cxx 5 Mar 2006 01:30:02 -0000 @@ -344,8 +344,7 @@ FGMetarEnvironmentCtrl::~FGMetarEnvironmentCtrl () { #if defined(ENABLE_THREADS) - thread->cancel(); - thread->join(); + stop(); #endif // ENABLE_THREADS delete env; @@ -590,8 +589,7 @@ #if defined(ENABLE_THREADS) if (_error_count++ >= 3) { SG_LOG( SG_GENERAL, SG_WARN, "Stop fetching data permanently."); - thread->cancel(); - thread->join(); + stop(); } #endif @@ -708,11 +706,20 @@ #if defined(ENABLE_THREADS) void +FGMetarEnvironmentCtrl::stop() +{ + request_queue.push( string() ); // ask metar thread to terminate + thread->join(); +} + +void FGMetarEnvironmentCtrl::MetarThread::run() { while ( true ) { string icao = fetcher->request_queue.pop(); + if (icao.empty()) + return; SG_LOG( SG_GENERAL, SG_INFO, "Thread: fetch metar data = " << icao ); FGMetarResult result = fetcher->fetch_data( icao ); fetcher->result_queue.push( result ); Index: src/Environment/environment_ctrl.hxx =================================================================== RCS file: /var/cvs/FlightGear-0.9/source/src/Environment/environment_ctrl.hxx,v retrieving revision 1.22 diff -u -r1.22 environment_ctrl.hxx --- src/Environment/environment_ctrl.hxx 21 Feb 2006 13:19:33 -0000 1.22 +++ src/Environment/environment_ctrl.hxx 5 Mar 2006 01:30:02 -0000 @@ -240,7 +240,7 @@ */ MetarThread* thread; - + void stop(); #endif // ENABLE_THREADS int _error_count;
pgpQ2Dq1MeXHm.pgp
Description: PGP signature