diff --git a/libretroshare/src/plugins/pluginmanager.cc b/libretroshare/src/plugins/pluginmanager.cc index f0fb537e6..84af1fc86 100644 --- a/libretroshare/src/plugins/pluginmanager.cc +++ b/libretroshare/src/plugins/pluginmanager.cc @@ -174,7 +174,7 @@ void RsPluginManager::loadPlugins(const std::vector& plugin_directo saveConfiguration(); } -void RsPluginManager::stopPlugins() +void RsPluginManager::stopPlugins(p3ServiceServer *pqih) { std::cerr << " Stopping plugins." << std::endl; @@ -182,16 +182,21 @@ void RsPluginManager::stopPlugins() { if (_plugins[i].plugin != NULL) { + p3Service *service = _plugins[i].plugin->p3_service(); + if (service) + { + pqih->removeService(service); + } + _plugins[i].plugin->stop(); -// delete _plugins[i].plugin; -// _plugins[i].plugin = NULL; + delete _plugins[i].plugin; + _plugins[i].plugin = NULL; + } + if (_plugins[i].handle) + { + dlclose(_plugins[i].handle); + _plugins[i].handle = NULL; } -// Causes a crash -// if (_plugins[i].handle) -// { -// dlclose(_plugins[i].handle); -// _plugins[i].handle = NULL; -// } } } diff --git a/libretroshare/src/plugins/pluginmanager.h b/libretroshare/src/plugins/pluginmanager.h index 04df4a8e5..5f2a8c3b7 100644 --- a/libretroshare/src/plugins/pluginmanager.h +++ b/libretroshare/src/plugins/pluginmanager.h @@ -98,7 +98,7 @@ class RsPluginManager: public RsPluginHandler, public p3Config // void loadPlugins(const std::vector& explicit_plugin_entries) ; - void stopPlugins(); + void stopPlugins(p3ServiceServer *pqih); void registerCacheServices() ; void registerClientServices(p3ServiceServer *pqih) ; diff --git a/libretroshare/src/pqi/pqiservice.cc b/libretroshare/src/pqi/pqiservice.cc index f0a064878..bfc3415a5 100644 --- a/libretroshare/src/pqi/pqiservice.cc +++ b/libretroshare/src/pqi/pqiservice.cc @@ -84,6 +84,31 @@ int p3ServiceServer::addService(pqiService *ts, bool defaultOn) return 1; } +int p3ServiceServer::removeService(pqiService *ts) +{ + RsStackMutex stack(srvMtx); /********* LOCKED *********/ + +#ifdef SERVICE_DEBUG + pqioutput(PQL_DEBUG_BASIC, pqiservicezone, "p3ServiceServer::removeService()"); +#endif + + RsServiceInfo info = ts->getServiceInfo(); + + // This doesn't need to be in Mutex. + mServiceControl->deregisterService(info.mServiceType); + + std::map::iterator it = services.find(info.mServiceType); + if (it == services.end()) + { + std::cerr << "p3ServiceServer::removeService(): Service not found with id " << info.mServiceType << "!" << std::endl; + return -1; + } + + services.erase(it); + + return 1; +} + bool p3ServiceServer::recvItem(RsRawItem *item) { RsStackMutex stack(srvMtx); /********* LOCKED *********/ diff --git a/libretroshare/src/pqi/pqiservice.h b/libretroshare/src/pqi/pqiservice.h index 9dad22e4f..c293cc005 100644 --- a/libretroshare/src/pqi/pqiservice.h +++ b/libretroshare/src/pqi/pqiservice.h @@ -109,6 +109,7 @@ public: p3ServiceServer(pqiPublisher *pub, p3ServiceControl *ctrl); int addService(pqiService *, bool defaultOn); +int removeService(pqiService *); bool recvItem(RsRawItem *); bool sendItem(RsRawItem *); diff --git a/libretroshare/src/retroshare/rsplugin.h b/libretroshare/src/retroshare/rsplugin.h index 2f00e3983..7fab66382 100644 --- a/libretroshare/src/retroshare/rsplugin.h +++ b/libretroshare/src/retroshare/rsplugin.h @@ -121,6 +121,9 @@ public: class RsPlugin { public: + RsPlugin() {} + virtual ~RsPlugin() {} + // //================================ Services ==================================// // diff --git a/libretroshare/src/rsserver/p3face-config.cc b/libretroshare/src/rsserver/p3face-config.cc index 4745f6eeb..3124ee912 100644 --- a/libretroshare/src/rsserver/p3face-config.cc +++ b/libretroshare/src/rsserver/p3face-config.cc @@ -83,7 +83,7 @@ void RsServer::rsGlobalShutDown() ConfigFinalSave(); // save configuration before exit - mPluginsManager->stopPlugins(); + mPluginsManager->stopPlugins(pqih); mNetMgr->shutdown(); /* Handles UPnP */ diff --git a/plugins/FeedReader/FeedReaderPlugin.cpp b/plugins/FeedReader/FeedReaderPlugin.cpp index 4f743a6fd..bbe0f88d7 100644 --- a/plugins/FeedReader/FeedReaderPlugin.cpp +++ b/plugins/FeedReader/FeedReaderPlugin.cpp @@ -44,11 +44,9 @@ extern "C" { #ifdef WIN32 __declspec(dllexport) #endif - void *RETROSHARE_PLUGIN_provide() + RsPlugin *RETROSHARE_PLUGIN_provide() { - static FeedReaderPlugin *p = new FeedReaderPlugin(); - - return (void*)p; + return new FeedReaderPlugin(); } // This symbol contains the svn revision number grabbed from the executable. diff --git a/plugins/VOIP/VOIPPlugin.cpp b/plugins/VOIP/VOIPPlugin.cpp index 28e26d622..833b4cd42 100644 --- a/plugins/VOIP/VOIPPlugin.cpp +++ b/plugins/VOIP/VOIPPlugin.cpp @@ -51,11 +51,9 @@ extern "C" { // - always respect the C linkage convention // - always return an object of type RsPlugin* // - void *RETROSHARE_PLUGIN_provide() + RsPlugin *RETROSHARE_PLUGIN_provide() { - static VOIPPlugin *p = new VOIPPlugin() ; - - return (void*)p ; + return new VOIPPlugin() ; } // This symbol contains the svn revision number grabbed from the executable.