Unverified Commit fa43cfd7 authored by peastman's avatar peastman Committed by GitHub
Browse files

Merge pull request #2358 from tallakahath/master

Support for multiple paths in OPENMM_PLUGIN_DIR
parents 2ff59259 40a9d051
...@@ -213,19 +213,24 @@ public: ...@@ -213,19 +213,24 @@ public:
*/ */
static void loadPluginLibrary(const std::string& file); static void loadPluginLibrary(const std::string& file);
/** /**
* Load multiple dynamic libraries (DLLs) which contain OpenMM plugins from a single directory. * Load multiple dynamic libraries (DLLs) which contain OpenMM plugins from one or more directories.
* This method loops over every file contained in the specified directory and calls loadPluginLibrary() * Multiple fully-qualified paths can be joined together with ':' on unix-like systems
* (or ';' on windows-like systems); each will be searched for plugins, in-order. For example,
* '/foo/plugins:/bar/plugins' will search both `/foo/plugins` and `/bar/plugins`. If an
* identically-named plugin is encountered twice it will be loaded at both points; be careful!!!
*
* This method loops over every file contained in the specified directories and calls loadPluginLibrary()
* for each one. If an error occurs while trying to load a particular file, that file is simply * for each one. If an error occurs while trying to load a particular file, that file is simply
* ignored. You can retrieve a list of all such errors by calling getPluginLoadFailures(). * ignored. You can retrieve a list of all such errors by calling getPluginLoadFailures().
* *
* @param directory the path to the directory containing libraries to load * @param directory a ':' (unix) or ';' (windows) deliminated list of paths containing libraries to load
* @return the names of all files which were successfully loaded as libraries * @return the names of all files which were successfully loaded as libraries
*/ */
static std::vector<std::string> loadPluginsFromDirectory(const std::string& directory); static std::vector<std::string> loadPluginsFromDirectory(const std::string& directory);
/** /**
* Get the default directory from which to load plugins. If the environment variable * Get the default directory from which to load plugins. If the environment variable
* OPENMM_PLUGIN_DIR is set, this returns its value. Otherwise, it returns a platform * OPENMM_PLUGIN_DIR is set, this returns its value. Otherwise, it returns a platform
* specific default location. * specific default location.
* *
* @return the path to the default plugin directory * @return the path to the default plugin directory
*/ */
......
...@@ -37,7 +37,6 @@ ...@@ -37,7 +37,6 @@
#include "openmm/internal/ContextImpl.h" #include "openmm/internal/ContextImpl.h"
#ifdef WIN32 #ifdef WIN32
#include <windows.h> #include <windows.h>
#include <sstream>
#else #else
#ifndef __PNACL__ #ifndef __PNACL__
#include <dlfcn.h> #include <dlfcn.h>
...@@ -45,6 +44,7 @@ ...@@ -45,6 +44,7 @@
#include <dirent.h> #include <dirent.h>
#include <cstdlib> #include <cstdlib>
#endif #endif
#include <sstream>
#include <set> #include <set>
#include <algorithm> #include <algorithm>
...@@ -261,31 +261,42 @@ void Platform::loadPluginLibrary(const string& file) { ...@@ -261,31 +261,42 @@ void Platform::loadPluginLibrary(const string& file) {
vector<string> Platform::loadPluginsFromDirectory(const string& directory) { vector<string> Platform::loadPluginsFromDirectory(const string& directory) {
vector<string> files; vector<string> files;
char dirSeparator; char dirSeparator;
char pathSeparator;
stringstream sdirectory(directory);
#ifdef WIN32 #ifdef WIN32
dirSeparator = '\\'; dirSeparator = '\\';
pathSeparator = ';';
WIN32_FIND_DATA fileInfo; WIN32_FIND_DATA fileInfo;
string filePattern(directory + dirSeparator + "*.dll");
HANDLE findHandle = FindFirstFile(filePattern.c_str(), &fileInfo); for (string path; std::getline(sdirectory, path, pathSeparator);) {
if (findHandle != INVALID_HANDLE_VALUE) { string filePattern(path + dirSeparator + "*.dll");
do { HANDLE findHandle = FindFirstFile(filePattern.c_str(), &fileInfo);
if (fileInfo.cFileName[0] != '.') if (findHandle != INVALID_HANDLE_VALUE) {
files.push_back(string(fileInfo.cFileName)); do {
} while (FindNextFile(findHandle, &fileInfo)); if (fileInfo.cFileName[0] != '.')
FindClose(findHandle); files.push_back(path+dirSeparator+string(fileInfo.cFileName));
} while (FindNextFile(findHandle, &fileInfo));
FindClose(findHandle);
}
} }
vector<HMODULE> plugins; vector<HMODULE> plugins;
#else #else
dirSeparator = '/';
DIR* dir; DIR* dir;
dirSeparator = '/';
pathSeparator = ':';
struct dirent *entry; struct dirent *entry;
dir = opendir(directory.c_str());
if (dir != NULL) { for (string path; std::getline(sdirectory, path, pathSeparator);) {
while ((entry = readdir(dir)) != NULL) { dir = opendir(path.c_str());
if (entry->d_name[0] != '.') if (dir != NULL) {
files.push_back(string(entry->d_name)); while ((entry = readdir(dir)) != NULL) {
if (entry->d_name[0] != '.')
files.push_back(path+dirSeparator+string(entry->d_name));
}
closedir(dir);
} }
closedir(dir);
} }
vector<void*> plugins; vector<void*> plugins;
#endif #endif
vector<string> loadedLibraries; vector<string> loadedLibraries;
...@@ -294,7 +305,7 @@ vector<string> Platform::loadPluginsFromDirectory(const string& directory) { ...@@ -294,7 +305,7 @@ vector<string> Platform::loadPluginsFromDirectory(const string& directory) {
for (unsigned int i = 0; i < files.size(); ++i) { for (unsigned int i = 0; i < files.size(); ++i) {
try { try {
plugins.push_back(loadOneLibrary(directory+dirSeparator+files[i])); plugins.push_back(loadOneLibrary(files[i]));
loadedLibraries.push_back(files[i]); loadedLibraries.push_back(files[i]);
} catch (OpenMMException& ex) { } catch (OpenMMException& ex) {
pluginLoadFailures.push_back(ex.what()); pluginLoadFailures.push_back(ex.what());
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment