BsDynLibManager.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Utility/BsDynLibManager.h"
  4. #include "Utility/BsDynLib.h"
  5. namespace bs
  6. {
  7. DynLibManager::DynLibManager()
  8. {
  9. }
  10. DynLib* DynLibManager::load(const String& name)
  11. {
  12. // Add the extension (.dll, .so, ...) if necessary.
  13. String filename = name;
  14. const UINT32 length = (UINT32)filename.length();
  15. const String extension = String(".") + DynLib::EXTENSION;
  16. const UINT32 extLength = (UINT32)extension.length();
  17. if (length <= extLength || filename.substr(length - extLength) != extension)
  18. filename += extension;
  19. if(DynLib::PREFIX != nullptr)
  20. filename = DynLib::PREFIX + filename;
  21. auto iterFind = mLoadedLibraries.find(filename);
  22. if (iterFind != mLoadedLibraries.end())
  23. {
  24. return iterFind->second;
  25. }
  26. else
  27. {
  28. DynLib* newLib = new (bs_alloc<DynLib>()) DynLib(filename);
  29. mLoadedLibraries[filename] = newLib;
  30. return newLib;
  31. }
  32. }
  33. void DynLibManager::unload(DynLib* lib)
  34. {
  35. auto iterFind = mLoadedLibraries.find(lib->getName());
  36. if (iterFind != mLoadedLibraries.end())
  37. {
  38. mLoadedLibraries.erase(iterFind);
  39. }
  40. lib->unload();
  41. bs_delete(lib);
  42. }
  43. DynLibManager::~DynLibManager()
  44. {
  45. // Unload & delete resources in turn
  46. for(auto& entry : mLoadedLibraries)
  47. {
  48. entry.second->unload();
  49. bs_delete(entry.second);
  50. }
  51. // Empty the list
  52. mLoadedLibraries.clear();
  53. }
  54. DynLibManager& gDynLibManager()
  55. {
  56. return DynLibManager::instance();
  57. }
  58. }