diff options
author | Sascha Volkenandt <sascha (at) akv-soft (dot) de> | 2007-01-04 17:42:33 +0000 |
---|---|---|
committer | Sascha Volkenandt <sascha (at) akv-soft (dot) de> | 2007-01-04 17:42:33 +0000 |
commit | 61e31de98b97f556cfb2a0cafa172bde673e7859 (patch) | |
tree | f92c3c42107f89a7de7b3c489527b3b6a2421078 | |
parent | c5cb6d2e099c9ae44cc3d26e4800c9f9101852e7 (diff) | |
download | vdr-plugin-live-61e31de98b97f556cfb2a0cafa172bde673e7859.tar.gz vdr-plugin-live-61e31de98b97f556cfb2a0cafa172bde673e7859.tar.bz2 |
- removed thread-unsafe call of cPlugin::ConfigDirectory and replaced it with Plugin::GetConfigDirectory
- implemented proper shutdown of server thread on vdr termination
-rw-r--r-- | live.cpp | 6 | ||||
-rw-r--r-- | live.h | 5 | ||||
-rw-r--r-- | thread.cpp | 33 | ||||
-rw-r--r-- | thread.h | 7 | ||||
-rw-r--r-- | tntconfig.cpp | 5 |
5 files changed, 45 insertions, 11 deletions
@@ -3,7 +3,7 @@ * * See the README file for copyright information and how to reach the author. * - * $Id: live.cpp,v 1.6 2007/01/04 15:02:00 lordjaxom Exp $ + * $Id: live.cpp,v 1.7 2007/01/04 17:42:33 lordjaxom Exp $ */ #include <vdr/plugin.h> @@ -20,8 +20,11 @@ using namespace std; const char *Plugin::VERSION = "0.0.1"; const char *Plugin::DESCRIPTION = "Live Integrated VDR Environment"; +std::string Plugin::m_configDirectory; + Plugin::Plugin(void) { + m_configDirectory = cPlugin::ConfigDirectory( PLUGIN_NAME_I18N ); } const char *Plugin::CommandLineHelp(void) @@ -45,6 +48,7 @@ bool Plugin::Start(void) void Plugin::Stop(void) { + m_thread->Stop(); } void Plugin::MainThreadHook(void) @@ -2,6 +2,7 @@ #define VDR_LIVE_LIVE_H #include <memory> +#include <string> #include <vdr/plugin.h> #include "thread.h" @@ -40,10 +41,14 @@ public: virtual Setup& GetLiveSetup(); virtual TimerManager& GetLiveTimerManager(); + static std::string const& GetConfigDirectory() { return m_configDirectory; } + private: static const char *VERSION; static const char *DESCRIPTION; + static std::string m_configDirectory; + std::auto_ptr< ServerThread > m_thread; }; @@ -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() ); @@ -1,8 +1,11 @@ #ifndef VDR_LIVE_THREAD_H #define VDR_LIVE_THREAD_H +#include <memory> #include <vdr/thread.h> +namespace tnt { class Tntnet; } + namespace vdrlive { class ServerThread : public cThread { @@ -10,11 +13,13 @@ public: ServerThread(); virtual ~ServerThread(); + void Stop(); + protected: virtual void Action(); private: - char* m_configPath; + std::auto_ptr< tnt::Tntnet > m_server; }; } // namespace vdrlive diff --git a/tntconfig.cpp b/tntconfig.cpp index 60bfad2..2036a46 100644 --- a/tntconfig.cpp +++ b/tntconfig.cpp @@ -4,6 +4,7 @@ #include <sstream> #include <stdexcept> #include <vdr/plugin.h> +#include "live.h" #include "setup.h" #include "tntconfig.h" @@ -21,7 +22,7 @@ void TntConfig::WriteConfig() WriteProperties(); ostringstream builder; - builder << cPlugin::ConfigDirectory( PLUGIN_NAME_I18N ) << "/httpd.config"; + builder << Plugin::GetConfigDirectory() << "/httpd.config"; m_configPath = builder.str(); ofstream file( m_configPath.c_str(), ios::out | ios::trunc ); @@ -47,7 +48,7 @@ void TntConfig::WriteConfig() void TntConfig::WriteProperties() { ostringstream builder; - builder << cPlugin::ConfigDirectory( PLUGIN_NAME_I18N ) << "/httpd.properties"; + builder << Plugin::GetConfigDirectory() << "/httpd.properties"; m_propertiesPath = builder.str(); ofstream file( m_propertiesPath.c_str(), ios::out | ios::trunc ); |