BsDynLibManager.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsDynLibManager.h"
  4. #include "BsDynLib.h"
  5. namespace BansheeEngine
  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. auto iterFind = mLoadedLibraries.find(filename);
  20. if (iterFind != mLoadedLibraries.end())
  21. {
  22. return iterFind->second;
  23. }
  24. else
  25. {
  26. DynLib* newLib = new (bs_alloc<DynLib>()) DynLib(filename);
  27. mLoadedLibraries[filename] = newLib;
  28. return newLib;
  29. }
  30. }
  31. void DynLibManager::unload(DynLib* lib)
  32. {
  33. auto iterFind = mLoadedLibraries.find(lib->getName());
  34. if (iterFind != mLoadedLibraries.end())
  35. {
  36. mLoadedLibraries.erase(iterFind);
  37. }
  38. lib->unload();
  39. bs_delete(lib);
  40. }
  41. DynLibManager::~DynLibManager()
  42. {
  43. // Unload & delete resources in turn
  44. for(auto& entry : mLoadedLibraries)
  45. {
  46. entry.second->unload();
  47. bs_delete(entry.second);
  48. }
  49. // Empty the list
  50. mLoadedLibraries.clear();
  51. }
  52. DynLibManager& gDynLibManager()
  53. {
  54. return DynLibManager::instance();
  55. }
  56. }