Skip to content

Commit 8a80797

Browse files
Merge pull request #34 from rhaschke/fix-on-demand-unloading
fix on demand unloading
2 parents 6807355 + f32686f commit 8a80797

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

include/class_loader/multi_library_class_loader.h

+4
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ class MultiLibraryClassLoader
7373
for(unsigned int c = 0; c < active_loaders.size(); c++)
7474
{
7575
ClassLoader* current = active_loaders.at(c);
76+
if (!current->isLibraryLoaded())
77+
current->loadLibrary();
7678
if(current->isClassAvailable<Base>(class_name))
7779
return(current->createInstance<Base>(class_name));
7880
}
@@ -113,6 +115,8 @@ class MultiLibraryClassLoader
113115
for(unsigned int c = 0; c < active_loaders.size(); c++)
114116
{
115117
ClassLoader* current = active_loaders.at(c);
118+
if (!current->isLibraryLoaded())
119+
current->loadLibrary();
116120
if(current->isClassAvailable<Base>(class_name))
117121
return(current->createUnmanagedInstance<Base>(class_name));
118122
}

test/utest.cpp

+62
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include <boost/bind.hpp>
33
#include <iostream>
44
#include <class_loader/class_loader.h>
5+
#include <class_loader/multi_library_class_loader.h>
56
#include "base.h"
67
#include <gtest/gtest.h>
78

@@ -297,8 +298,69 @@ TEST(ClassLoaderTest, loadRefCountingLazy)
297298
FAIL() << "Did not throw exception as expected.\n";
298299
}
299300

301+
300302
/*****************************************************************************/
301303

304+
void testMultiClassLoader(bool lazy)
305+
{
306+
try
307+
{
308+
class_loader::MultiLibraryClassLoader loader(lazy);
309+
loader.loadLibrary(LIBRARY_1);
310+
loader.loadLibrary(LIBRARY_2);
311+
for (int i=0; i < 2; ++i) {
312+
loader.createInstance<Base>("Cat")->saySomething();
313+
loader.createInstance<Base>("Dog")->saySomething();
314+
loader.createInstance<Base>("Robot")->saySomething();
315+
}
316+
}
317+
catch(class_loader::ClassLoaderException& e)
318+
{
319+
FAIL() << "ClassLoaderException: " << e.what() << "\n";
320+
}
321+
322+
SUCCEED();
323+
}
324+
325+
TEST(MultiClassLoaderTest, lazyLoad)
326+
{
327+
testMultiClassLoader(true);
328+
}
329+
TEST(MultiClassLoaderTest, lazyLoadSecondTime)
330+
{
331+
testMultiClassLoader(true);
332+
}
333+
TEST(MultiClassLoaderTest, nonLazyLoad)
334+
{
335+
testMultiClassLoader(false);
336+
}
337+
TEST(MultiClassLoaderTest, noWarningOnLazyLoad)
338+
{
339+
try
340+
{
341+
boost::shared_ptr<Base> cat, dog, rob;
342+
{
343+
class_loader::MultiLibraryClassLoader loader(true);
344+
loader.loadLibrary(LIBRARY_1);
345+
loader.loadLibrary(LIBRARY_2);
346+
347+
cat = loader.createInstance<Base>("Cat");
348+
dog = loader.createInstance<Base>("Dog");
349+
rob = loader.createInstance<Base>("Robot");
350+
}
351+
cat->saySomething();
352+
dog->saySomething();
353+
rob->saySomething();
354+
}
355+
catch(class_loader::ClassLoaderException& e)
356+
{
357+
FAIL() << "ClassLoaderException: " << e.what() << "\n";
358+
}
359+
360+
SUCCEED();
361+
}
362+
363+
/*****************************************************************************/
302364

303365
// Run all the tests that were declared with TEST()
304366
int main(int argc, char **argv){

0 commit comments

Comments
 (0)