iLab Neuromorphic Robotics Toolkit  0.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DynamicLoaderImpl.H
Go to the documentation of this file.
1 /*! @file
2  @author Randolph Voorhies
3  @copyright GNU Public License (GPL v3)
4  @section License
5  @verbatim
6  // ////////////////////////////////////////////////////////////////////////
7  // The iLab Neuromorphic Robotics Toolkit (NRT) //
8  // Copyright 2010-2012 by the University of Southern California (USC) //
9  // and the iLab at USC. //
10  // //
11  // iLab - University of Southern California //
12  // Hedco Neurociences Building, Room HNB-10 //
13  // Los Angeles, Ca 90089-2520 - USA //
14  // //
15  // See http://ilab.usc.edu for information about this project. //
16  // ////////////////////////////////////////////////////////////////////////
17  // This file is part of The iLab Neuromorphic Robotics Toolkit. //
18  // //
19  // The iLab Neuromorphic Robotics Toolkit is free software: you can //
20  // redistribute it and/or modify it under the terms of the GNU General //
21  // Public License as published by the Free Software Foundation, either //
22  // version 3 of the License, or (at your option) any later version. //
23  // //
24  // The iLab Neuromorphic Robotics Toolkit is distributed in the hope //
25  // that it will be useful, but WITHOUT ANY WARRANTY; without even the //
26  // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //
27  // PURPOSE. See the GNU General Public License for more details. //
28  // //
29  // You should have received a copy of the GNU General Public License //
30  // along with The iLab Neuromorphic Robotics Toolkit. If not, see //
31  // <http://www.gnu.org/licenses/>. //
32  // ////////////////////////////////////////////////////////////////////////
33  @endverbatim */
34 
35 
36 inline nrt::DynamicLoader::DynamicLoader(std::string const & filename)
37 {
38  // Clear any old errors
39  dlerror();
40 
41  // Load the shared object file - try to reuse an already loaded one if possible
42  //itsLibraryHandle = dlopen(filename.c_str(), RTLD_LAZY | RTLD_NOLOAD | RTLD_NODELETE);
43  //if (itsLibraryHandle == nullptr) itsLibraryHandle = dlopen(filename.c_str(), RTLD_LAZY | RTLD_NODELETE);
44  itsLibraryHandle = dlopen(filename.c_str(), RTLD_LAZY);
45 
46  // Throw an exception if there were any errors
47  char const * err = dlerror();
48  if (err)
49  {
50  NRT_WARNING("Error opening dhared library [" << filename << "]: " << err);
51  throw nrt::exception::DynamicLoaderException(filename, err);
52  }
53 
54  itsFilename = filename;
55 }
56 
57 // ######################################################################
59 {
60  if (itsLibraryHandle) dlclose(itsLibraryHandle);
61 }
62 
63 // ######################################################################
64 template <class Signature> inline
65 std::function<Signature> nrt::DynamicLoader::load(std::string const & functionName)
66 {
67  // Clear any old errors
68  dlerror();
69 
70  // Try to load the symbol from the shared object
71  std::function<Signature> f = reinterpret_cast<Signature*>(dlsym(itsLibraryHandle, functionName.c_str()));
72 
73  // Throw an exception if there were any problems
74  char const * err = dlerror();
75  if (err)
76  {
77  NRT_WARNING("Error loading symbol [" << functionName << "] from shared library [" << itsFilename << "]: " << err);
78  throw nrt::exception::DynamicLoaderException(itsFilename, functionName, err);
79  }
80 
81  return f;
82 }