Use glibmm for modules instead of dlfch.h

This commit is contained in:
Paul Davis
2013-07-11 13:58:48 -04:00
parent 058ebf98b9
commit 83ed3d7dcc
6 changed files with 71 additions and 65 deletions

View File

@@ -17,7 +17,7 @@
*/
#include <dlfcn.h>
#include <glibmm/module.h>
#include <glibmm/fileutils.h>
@@ -29,8 +29,14 @@
#include "ardour/debug.h"
#include "ardour/control_protocol_manager.h"
#ifdef SearchPath
#undef SearchPath
#endif
#include "ardour/control_protocol_search_path.h"
using namespace ARDOUR;
using namespace std;
using namespace PBD;
@@ -179,7 +185,7 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi)
cpi.protocol = 0;
delete cpi.state;
cpi.state = 0;
dlclose (cpi.descriptor->module);
delete (Glib::Module*)cpi.descriptor->module;
ProtocolStatusChange (&cpi);
@@ -264,7 +270,7 @@ ControlProtocolManager::control_protocol_discover (string path)
string_compose(_("Control surface protocol discovered: \"%1\"\n"), cpi->name));
}
dlclose (descriptor->module);
delete (Glib::Module*)descriptor->module;
}
return 0;
@@ -273,31 +279,31 @@ ControlProtocolManager::control_protocol_discover (string path)
ControlProtocolDescriptor*
ControlProtocolManager::get_descriptor (string path)
{
void *module;
Glib::Module* module = new Glib::Module(path);
ControlProtocolDescriptor *descriptor = 0;
ControlProtocolDescriptor* (*dfunc)(void);
const char *errstr;
void* func = 0;
if ((module = dlopen (path.c_str(), RTLD_NOW)) == 0) {
error << string_compose(_("ControlProtocolManager: cannot load module \"%1\" (%2)"), path, dlerror()) << endmsg;
if (!(*module)) {
error << string_compose(_("ControlProtocolManager: cannot load module \"%1\" (%2)"), path, Glib::Module::get_last_error()) << endmsg;
delete module;
return 0;
}
dfunc = (ControlProtocolDescriptor* (*)(void)) dlsym (module, "protocol_descriptor");
if ((errstr = dlerror()) != 0) {
if (!module->get_symbol("protocol_descriptor", func)) {
error << string_compose(_("ControlProtocolManager: module \"%1\" has no descriptor function."), path) << endmsg;
error << errstr << endmsg;
dlclose (module);
error << Glib::Module::get_last_error() << endmsg;
delete module;
return 0;
}
dfunc = (ControlProtocolDescriptor* (*)(void))func;
descriptor = dfunc();
if (descriptor) {
descriptor->module = module;
descriptor->module = (void*)module;
} else {
dlclose (module);
delete module;
}
return descriptor;