containerManager.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include "containerManager.h"
  2. #include "containerManager.h"
  3. #include "containerManager.h"
  4. #include <globalAllocator/globalAllocator.h>
  5. bool pika::ContainerManager::createContainer
  6. (std::string name, pika::ContainerInformation containerInformation,
  7. pika::DllLoader &dllLoader, pika::LogManager &logManager)
  8. {
  9. if (runningContainers.find(name) != runningContainers.end())
  10. {
  11. logManager.log((std::string("Container name already exists: ") + name).c_str(), pika::LogManager::logError);
  12. return false;
  13. }
  14. pika::RuntimeContainer container = {};
  15. container.arena.allocateStaticMemory(containerInformation); //this just allocates the staic memory
  16. container.allocator.init(malloc(containerInformation.containerStaticInfo.defaultHeapMemorySize),
  17. containerInformation.containerStaticInfo.defaultHeapMemorySize);
  18. dllLoader.bindAllocatorDllRealm(&container.allocator);
  19. //this calls the constructors (from the dll realm)
  20. if (!dllLoader.constructRuntimeContainer(container, containerInformation.containerName.c_str()))
  21. {
  22. dllLoader.resetAllocatorDllRealm();
  23. logManager.log((std::string("Couldn't construct container: ") + name).c_str(), pika::LogManager::logError);
  24. container.arena.dealocateStaticMemory(); //static memory
  25. free(container.allocator.originalBaseMemory); //heap memory
  26. return false;
  27. }
  28. dllLoader.resetAllocatorDllRealm();
  29. dllLoader.bindAllocatorDllRealm(&container.allocator);
  30. container.pointer->create(); //this calls create() (from the dll realm)
  31. dllLoader.resetAllocatorDllRealm();//sets the global allocator back to standard (used for runtime realm)
  32. runningContainers[name] = container;
  33. return true;
  34. }
  35. void pika::ContainerManager::init()
  36. {
  37. }
  38. void pika::ContainerManager::update(pika::DllLoader &dllLoader, pika::Input input, float deltaTime, pika::WindowState windowState)
  39. {
  40. for (auto &c : runningContainers)
  41. {
  42. dllLoader.bindAllocatorDllRealm(&c.second.allocator);
  43. c.second.pointer->update(input, deltaTime, windowState);
  44. dllLoader.resetAllocatorDllRealm();
  45. }
  46. }
  47. bool pika::ContainerManager::destroyContainer(std::string name, pika::DllLoader &dllLoader,
  48. pika::LogManager &logManager)
  49. {
  50. auto c = runningContainers.find(name);
  51. if (c == runningContainers.end())
  52. {
  53. logManager.log((std::string("Couldn't find container for destruction: ") + name).c_str(),
  54. pika::LogManager::logError);
  55. return false;
  56. }
  57. dllLoader.bindAllocatorDllRealm(&c->second.allocator);
  58. dllLoader.destructContainer_(&(c->second.pointer), &c->second.arena);
  59. dllLoader.resetAllocatorDllRealm();
  60. c->second.arena.dealocateStaticMemory(); //static memory
  61. free(c->second.allocator.originalBaseMemory); //heap memory
  62. runningContainers.erase(c);
  63. return true;
  64. }
  65. void pika::ContainerManager::destroyAllContainers(pika::DllLoader &dllLoader,
  66. pika::LogManager &logManager)
  67. {
  68. for (auto &c : runningContainers)
  69. {
  70. destroyContainer(c.first, dllLoader, logManager);
  71. }
  72. }