From 61e31de98b97f556cfb2a0cafa172bde673e7859 Mon Sep 17 00:00:00 2001 From: Sascha Volkenandt Date: Thu, 4 Jan 2007 17:42:33 +0000 Subject: - removed thread-unsafe call of cPlugin::ConfigDirectory and replaced it with Plugin::GetConfigDirectory - implemented proper shutdown of server thread on vdr termination --- thread.cpp | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) (limited to 'thread.cpp') diff --git a/thread.cpp b/thread.cpp index cb2954a..9b0b436 100644 --- a/thread.cpp +++ b/thread.cpp @@ -11,25 +11,44 @@ namespace vdrlive { using namespace std; using namespace tnt; -ServerThread::ServerThread(): - m_configPath( 0 ) +class ProtectedCString +{ +public: + ProtectedCString( char const* string ): m_string( strdup( string ) ) {} + ~ProtectedCString() { free( m_string ); } + + operator char*() { return m_string; } + +private: + char* m_string; +}; + +ServerThread::ServerThread() { } ServerThread::~ServerThread() { - free( m_configPath ); + Stop(); +} + +void ServerThread::Stop() +{ + if ( Active() ) { + m_server->shutdown(); + Cancel( 5 ); + } } void ServerThread::Action() { try { - m_configPath = strdup( TntConfig::Get().GetConfigPath().c_str() ); + ProtectedCString configPath( TntConfig::Get().GetConfigPath().c_str() ); - char* argv[] = { "tntnet", "-c", m_configPath }; + char* argv[] = { "tntnet", "-c", configPath }; int argc = sizeof( argv ) / sizeof( argv[0] ); - Tntnet app( argc, argv ); - app.run(); + m_server.reset( new Tntnet( argc, argv ) ); + m_server->run(); } catch ( exception const& ex ) { // XXX move initial error handling to live.cpp esyslog( "ERROR: live httpd server crashed: %s", ex.what() ); -- cgit v1.2.3