Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
tsoc
openmm
Commits
e1b9275e
Commit
e1b9275e
authored
Dec 02, 2009
by
Peter Eastman
Browse files
Reworked plugin initialization again to remove non-threadsafe behavior
parent
339cb645
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
49 additions
and
51 deletions
+49
-51
olla/src/Platform.cpp
olla/src/Platform.cpp
+49
-51
No files found.
olla/src/Platform.cpp
View file @
e1b9275e
...
@@ -113,55 +113,7 @@ Kernel Platform::createKernel(const string& name, ContextImpl& context) const {
...
@@ -113,55 +113,7 @@ Kernel Platform::createKernel(const string& name, ContextImpl& context) const {
throw
OpenMMException
(
"Called createKernel() on a Platform which does not support the requested kernel"
);
throw
OpenMMException
(
"Called createKernel() on a Platform which does not support the requested kernel"
);
return
Kernel
(
kernelFactories
.
find
(
name
)
->
second
->
createKernelImpl
(
name
,
*
this
,
context
));
return
Kernel
(
kernelFactories
.
find
(
name
)
->
second
->
createKernelImpl
(
name
,
*
this
,
context
));
}
}
#ifdef WIN32
static
vector
<
HMODULE
>&
getPlugins
()
{
static
vector
<
HMODULE
>
plugins
;
return
plugins
;
}
#else
static
vector
<
void
*>&
getPlugins
()
{
static
vector
<
void
*>
plugins
;
return
plugins
;
}
#endif
vector
<
Platform
*>&
Platform
::
getPlatforms
()
{
vector
<
Platform
*>&
Platform
::
getPlatforms
()
{
if
(
getPlugins
().
size
()
>
0
)
{
// Initialize plugins before returning the list of platforms.
#ifdef WIN32
vector
<
HMODULE
>
plugins
=
getPlugins
();
getPlugins
().
clear
();
for
(
int
i
=
0
;
i
<
(
int
)
plugins
.
size
();
i
++
)
{
void
(
*
init
)();
*
(
void
**
)(
&
init
)
=
GetProcAddress
(
plugins
[
i
],
"registerPlatforms"
);
if
(
init
!=
NULL
)
(
*
init
)();
}
for
(
int
i
=
0
;
i
<
(
int
)
plugins
.
size
();
i
++
)
{
void
(
*
init
)();
*
(
void
**
)(
&
init
)
=
GetProcAddress
(
plugins
[
i
],
"registerKernelFactories"
);
if
(
init
!=
NULL
)
(
*
init
)();
}
#else
vector
<
void
*>
plugins
=
getPlugins
();
getPlugins
().
clear
();
for
(
int
i
=
0
;
i
<
(
int
)
plugins
.
size
();
i
++
)
{
void
(
*
init
)();
*
(
void
**
)(
&
init
)
=
dlsym
(
plugins
[
i
],
"registerPlatforms"
);
if
(
init
!=
NULL
)
(
*
init
)();
}
for
(
int
i
=
0
;
i
<
(
int
)
plugins
.
size
();
i
++
)
{
void
(
*
init
)();
*
(
void
**
)(
&
init
)
=
dlsym
(
plugins
[
i
],
"registerKernelFactories"
);
if
(
init
!=
NULL
)
(
*
init
)();
}
#endif
}
static
vector
<
Platform
*>
platforms
;
static
vector
<
Platform
*>
platforms
;
return
platforms
;
return
platforms
;
}
}
...
@@ -200,8 +152,8 @@ Platform& Platform::findPlatform(const vector<string>& kernelNames) {
...
@@ -200,8 +152,8 @@ Platform& Platform::findPlatform(const vector<string>& kernelNames) {
return
*
best
;
return
*
best
;
}
}
void
Platform
::
loadPluginLibrary
(
const
string
&
file
)
{
#ifdef WIN32
#ifdef WIN32
static
HMODULE
loadOneLibrary
(
const
string
&
file
)
{
// Tell Windows not to bother the user with ugly error boxes.
// Tell Windows not to bother the user with ugly error boxes.
const
UINT
oldErrorMode
=
SetErrorMode
(
SEM_FAILCRITICALERRORS
);
const
UINT
oldErrorMode
=
SetErrorMode
(
SEM_FAILCRITICALERRORS
);
HMODULE
handle
=
LoadLibrary
(
file
.
c_str
());
HMODULE
handle
=
LoadLibrary
(
file
.
c_str
());
...
@@ -211,12 +163,55 @@ void Platform::loadPluginLibrary(const string& file) {
...
@@ -211,12 +163,55 @@ void Platform::loadPluginLibrary(const string& file) {
stringstream
(
message
)
<<
"Error loading library "
<<
file
<<
": "
<<
GetLastError
();
stringstream
(
message
)
<<
"Error loading library "
<<
file
<<
": "
<<
GetLastError
();
throw
OpenMMException
(
message
);
throw
OpenMMException
(
message
);
}
}
return
handle
;
}
static
void
initializePlugins
(
vector
<
HMODULE
>&
plugins
)
{
for
(
int
i
=
0
;
i
<
(
int
)
plugins
.
size
();
i
++
)
{
void
(
*
init
)();
*
(
void
**
)(
&
init
)
=
GetProcAddress
(
plugins
[
i
],
"registerPlatforms"
);
if
(
init
!=
NULL
)
(
*
init
)();
}
for
(
int
i
=
0
;
i
<
(
int
)
plugins
.
size
();
i
++
)
{
void
(
*
init
)();
*
(
void
**
)(
&
init
)
=
GetProcAddress
(
plugins
[
i
],
"registerKernelFactories"
);
if
(
init
!=
NULL
)
(
*
init
)();
}
}
#else
#else
static
void
*
loadOneLibrary
(
const
string
&
file
)
{
void
*
handle
=
dlopen
(
file
.
c_str
(),
RTLD_LAZY
|
RTLD_GLOBAL
);
void
*
handle
=
dlopen
(
file
.
c_str
(),
RTLD_LAZY
|
RTLD_GLOBAL
);
if
(
handle
==
NULL
)
if
(
handle
==
NULL
)
throw
OpenMMException
(
"Error loading library "
+
file
+
": "
+
dlerror
());
throw
OpenMMException
(
"Error loading library "
+
file
+
": "
+
dlerror
());
return
handle
;
}
static
void
initializePlugins
(
vector
<
void
*>&
plugins
)
{
for
(
int
i
=
0
;
i
<
(
int
)
plugins
.
size
();
i
++
)
{
void
(
*
init
)();
*
(
void
**
)(
&
init
)
=
dlsym
(
plugins
[
i
],
"registerPlatforms"
);
if
(
init
!=
NULL
)
(
*
init
)();
}
for
(
int
i
=
0
;
i
<
(
int
)
plugins
.
size
();
i
++
)
{
void
(
*
init
)();
*
(
void
**
)(
&
init
)
=
dlsym
(
plugins
[
i
],
"registerKernelFactories"
);
if
(
init
!=
NULL
)
(
*
init
)();
}
}
#endif
void
Platform
::
loadPluginLibrary
(
const
string
&
file
)
{
#ifdef WIN32
vector
<
HMODULE
>
plugins
;
#else
vector
<
void
*>
plugins
;
#endif
#endif
getPlugins
().
push_back
(
handle
);
plugins
.
push_back
(
loadOneLibrary
(
file
));
initializePlugins
(
plugins
);
}
}
vector
<
string
>
Platform
::
loadPluginsFromDirectory
(
const
string
&
directory
)
{
vector
<
string
>
Platform
::
loadPluginsFromDirectory
(
const
string
&
directory
)
{
...
@@ -234,6 +229,7 @@ vector<string> Platform::loadPluginsFromDirectory(const string& directory) {
...
@@ -234,6 +229,7 @@ vector<string> Platform::loadPluginsFromDirectory(const string& directory) {
}
while
(
FindNextFile
(
findHandle
,
&
fileInfo
));
}
while
(
FindNextFile
(
findHandle
,
&
fileInfo
));
FindClose
(
findHandle
);
FindClose
(
findHandle
);
}
}
vector
<
HMODULE
>
plugins
;
#else
#else
dirSeparator
=
'/'
;
dirSeparator
=
'/'
;
DIR
*
dir
;
DIR
*
dir
;
...
@@ -246,16 +242,18 @@ vector<string> Platform::loadPluginsFromDirectory(const string& directory) {
...
@@ -246,16 +242,18 @@ vector<string> Platform::loadPluginsFromDirectory(const string& directory) {
}
}
closedir
(
dir
);
closedir
(
dir
);
}
}
vector
<
void
*>
plugins
;
#endif
#endif
vector
<
string
>
loadedLibraries
;
vector
<
string
>
loadedLibraries
;
for
(
unsigned
int
i
=
0
;
i
<
files
.
size
();
++
i
)
{
for
(
unsigned
int
i
=
0
;
i
<
files
.
size
();
++
i
)
{
try
{
try
{
Platform
::
loadPlugin
Library
(
directory
+
dirSeparator
+
files
[
i
]);
plugins
.
push_back
(
loadOne
Library
(
directory
+
dirSeparator
+
files
[
i
])
)
;
loadedLibraries
.
push_back
(
files
[
i
]);
loadedLibraries
.
push_back
(
files
[
i
]);
}
catch
(
OpenMMException
ex
)
{
}
catch
(
OpenMMException
ex
)
{
// Just ignore it.
// Just ignore it.
}
}
}
}
initializePlugins
(
plugins
);
return
loadedLibraries
;
return
loadedLibraries
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment