BsScriptObjectManager.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "BsScriptObjectManager.h"
  2. #include "BsScriptObject.h"
  3. #include "BsMonoManager.h"
  4. #include "BsScriptAssemblyManager.h"
  5. #include "BsMonoAssembly.h"
  6. namespace BansheeEngine
  7. {
  8. ScriptObjectManager::ScriptObjectManager()
  9. :mFinalizedQueueIdx(0)
  10. {
  11. }
  12. ScriptObjectManager::~ScriptObjectManager()
  13. {
  14. processFinalizedObjects();
  15. }
  16. void ScriptObjectManager::registerScriptObject(ScriptObjectBase* instance)
  17. {
  18. mScriptObjects.insert(instance);
  19. }
  20. void ScriptObjectManager::unregisterScriptObject(ScriptObjectBase* instance)
  21. {
  22. mScriptObjects.erase(instance);
  23. }
  24. void ScriptObjectManager::refreshAssemblies(const Vector<std::pair<String, Path>>& assemblies)
  25. {
  26. Map<ScriptObjectBase*, ScriptObjectBackup> backupData;
  27. onRefreshStarted();
  28. for (auto& scriptObject : mScriptObjects)
  29. backupData[scriptObject] = scriptObject->beginRefresh();
  30. MonoManager::instance().unloadScriptDomain();
  31. // Unload script domain should trigger finalizers on everything, but since we usually delay
  32. // their processing we need to manually trigger it here.
  33. processFinalizedObjects();
  34. for (auto& scriptObject : mScriptObjects)
  35. assert(scriptObject->isPersistent() && "Non-persistent ScriptObject alive after domain unload.");
  36. for (auto& scriptObject : mScriptObjects)
  37. scriptObject->_clearManagedInstance();
  38. ScriptAssemblyManager::instance().clearAssemblyInfo();
  39. for (auto& assemblyPair : assemblies)
  40. {
  41. MonoManager::instance().loadAssembly(assemblyPair.second.toString(), assemblyPair.first);
  42. ScriptAssemblyManager::instance().loadAssemblyInfo(assemblyPair.first);
  43. }
  44. onRefreshDomainLoaded();
  45. for (auto& scriptObject : mScriptObjects)
  46. scriptObject->_restoreManagedInstance();
  47. for (auto& scriptObject : mScriptObjects)
  48. scriptObject->endRefresh(backupData[scriptObject]);
  49. onRefreshComplete();
  50. }
  51. void ScriptObjectManager::notifyObjectFinalized(ScriptObjectBase* instance)
  52. {
  53. BS_LOCK_MUTEX(mMutex);
  54. mFinalizedObjects[mFinalizedQueueIdx].push_back(instance);
  55. }
  56. void ScriptObjectManager::update()
  57. {
  58. processFinalizedObjects();
  59. }
  60. void ScriptObjectManager::processFinalizedObjects()
  61. {
  62. UINT32 readQueueIdx = 0;
  63. {
  64. BS_LOCK_MUTEX(mMutex);
  65. readQueueIdx = mFinalizedQueueIdx;
  66. mFinalizedQueueIdx = (mFinalizedQueueIdx + 1) % 2;
  67. }
  68. for (auto& finalizedObj : mFinalizedObjects[readQueueIdx])
  69. finalizedObj->_onManagedInstanceDeleted();
  70. mFinalizedObjects[readQueueIdx].clear();
  71. }
  72. }