BsScriptObjectManager.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "BsScriptObjectManager.h"
  2. #include "BsScriptObject.h"
  3. #include "BsMonoManager.h"
  4. #include "BsScriptAssemblyManager.h"
  5. namespace BansheeEngine
  6. {
  7. ScriptObjectManager::ScriptObjectManager()
  8. :mFinalizedQueueIdx(0)
  9. {
  10. }
  11. void ScriptObjectManager::registerScriptObject(ScriptObjectBase* instance)
  12. {
  13. mScriptObjects.insert(instance);
  14. }
  15. void ScriptObjectManager::unregisterScriptObject(ScriptObjectBase* instance)
  16. {
  17. mScriptObjects.erase(instance);
  18. }
  19. void ScriptObjectManager::refreshAssemblies()
  20. {
  21. Map<ScriptObjectBase*, ScriptObjectBackup> backupData;
  22. onRefreshStarted();
  23. for (auto& scriptObject : mScriptObjects)
  24. backupData[scriptObject] = scriptObject->beginRefresh();
  25. MonoManager::instance().unloadScriptDomain();
  26. // Unload script domain should trigger finalizers on everything, but since we usually delay
  27. // their processing we need to manually trigger it here.
  28. processFinalizedObjects();
  29. for (auto& scriptObject : mScriptObjects)
  30. assert(scriptObject->isPersistent() && "Non-persistent ScriptObject alive after domain unload.");
  31. for (auto& scriptObject : mScriptObjects)
  32. scriptObject->_clearManagedInstance();
  33. MonoManager::instance().loadScriptDomain();
  34. ScriptAssemblyManager::instance().refreshAssemblyInfo();
  35. onRefreshDomainLoaded();
  36. for (auto& scriptObject : mScriptObjects)
  37. scriptObject->_restoreManagedInstance();
  38. for (auto& scriptObject : mScriptObjects)
  39. scriptObject->endRefresh(backupData[scriptObject]);
  40. onRefreshComplete();
  41. }
  42. void ScriptObjectManager::notifyObjectFinalized(ScriptObjectBase* instance)
  43. {
  44. UINT32 idx = mFinalizedQueueIdx.load(std::memory_order_relaxed);
  45. mFinalizedObjects[idx].push_back(instance);
  46. }
  47. void ScriptObjectManager::update()
  48. {
  49. processFinalizedObjects();
  50. }
  51. void ScriptObjectManager::processFinalizedObjects()
  52. {
  53. UINT32 readQueueIdx = mFinalizedQueueIdx.fetch_xor(0x1, std::memory_order_relaxed);
  54. for (auto& finalizedObj : mFinalizedObjects[readQueueIdx])
  55. finalizedObj->_onManagedInstanceDeleted();
  56. mFinalizedObjects[readQueueIdx].clear();
  57. }
  58. }