BsScriptObjectManager.cpp 2.1 KB

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