/* Web Polygraph http://www.web-polygraph.org/
* (C) 2003-2006 The Measurement Factory
* Licensed under the Apache License, Version 2.0 */
#include "xstd/xstd.h"
#include "xstd/h/dlfcn.h"
#include "xstd/Assert.h"
#include "xstd/LoadableModule.h"
LoadableModule::LoadableModule(const String &aName): theName(aName), theHandle(0) {
}
LoadableModule::~LoadableModule() {
if (loaded())
unload();
}
bool LoadableModule::loaded() const {
return theHandle != 0;
}
bool LoadableModule::load(int mode) {
if (Should(!loaded())) {
theHandle = dlopen(theName.cstr(),
mode == lmNow ? RTLD_NOW : RTLD_LAZY);
if (loaded())
return true;
theError = dlerror();
} else {
theError = "internal error: reusing LoadableModule object";
}
return false;
}
bool LoadableModule::unload() {
if (Should(loaded())) {
if (dlclose(theHandle) == 0)
return true;
theError = dlerror();
} else {
theError = "internal error: unloading not loaded module";
}
return false;
}
syntax highlighted by Code2HTML, v. 0.9.1