|
|
@@ -3,6 +3,28 @@
|
|
|
#include "containerManager.h"
|
|
|
#include <globalAllocator/globalAllocator.h>
|
|
|
#include <unordered_set>
|
|
|
+#include <chrono>
|
|
|
+#include <thread>
|
|
|
+#include <unordered_map>
|
|
|
+
|
|
|
+pika::containerId_t pika::ContainerManager::createContainer(std::string containerName,
|
|
|
+ pika::LoadedDll &loadedDll, pika::LogManager &logManager)
|
|
|
+{
|
|
|
+
|
|
|
+ for(auto &i : loadedDll.containerInfo)
|
|
|
+ {
|
|
|
+
|
|
|
+ if (i.containerName == containerName)
|
|
|
+ {
|
|
|
+ return createContainer(i, loadedDll, logManager);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ logManager.log(("Couldn't create container, couldn't find the name: " + containerName).c_str(), pika::logError);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
pika::containerId_t pika::ContainerManager::createContainer
|
|
|
(pika::ContainerInformation containerInformation,
|
|
|
@@ -55,6 +77,8 @@ pika::containerId_t pika::ContainerManager::createContainer
|
|
|
|
|
|
runningContainers[id] = container;
|
|
|
|
|
|
+ logManager.log(("Created container: " + container.baseContainerName).c_str());
|
|
|
+
|
|
|
return id;
|
|
|
}
|
|
|
|
|
|
@@ -68,44 +92,13 @@ void pika::ContainerManager::update(pika::LoadedDll &loadedDll, pika::PikaWindow
|
|
|
|
|
|
#pragma region reload dll
|
|
|
|
|
|
- if (loadedDll.shouldReloadDll() || window.input.buttons[pika::Button::P].released())
|
|
|
- {
|
|
|
-
|
|
|
- auto oldContainerIndo = loadedDll.containerInfo;
|
|
|
+ //todo button to reload dll
|
|
|
|
|
|
- PIKA_PERMA_ASSERT(loadedDll.tryToloadDllUntillPossible(loadedDll.id, logs, std::chrono::seconds(5)),
|
|
|
- "Couldn't reload dll");
|
|
|
+ //todo try to recover from a failed load
|
|
|
|
|
|
- //clear containers that dissapeared
|
|
|
- {
|
|
|
- std::unordered_set<std::string> containerNames;
|
|
|
- for (auto &c : loadedDll.containerInfo)
|
|
|
- {
|
|
|
- containerNames.insert(c.containerName);
|
|
|
- }
|
|
|
-
|
|
|
- std::vector<pika::containerId_t> containersToClean;
|
|
|
- for (auto &i : runningContainers)
|
|
|
- {
|
|
|
- if (containerNames.find(i.second.baseContainerName) ==
|
|
|
- containerNames.end())
|
|
|
- {
|
|
|
- std::string l = "Killed container because it does not exist anymore in dll: " + i.second.baseContainerName
|
|
|
- + " #" + std::to_string(i.first);
|
|
|
- logs.log(l.c_str(), pika::logError);
|
|
|
-
|
|
|
- containersToClean.push_back(i.first);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- for (auto i : containersToClean)
|
|
|
- {
|
|
|
- forceTerminateContainer(i, loadedDll, logs);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- loadedDll.gameplayReload_(window.context);
|
|
|
-
|
|
|
+ if (loadedDll.shouldReloadDll())
|
|
|
+ {
|
|
|
+ reloadDll(loadedDll, window, logs);
|
|
|
}
|
|
|
|
|
|
//if (loadedDll.shouldReloadDll() || window.input.buttons[pika::Button::P].released())
|
|
|
@@ -169,6 +162,108 @@ void pika::ContainerManager::update(pika::LoadedDll &loadedDll, pika::PikaWindow
|
|
|
|
|
|
}
|
|
|
|
|
|
+void pika::ContainerManager::reloadDll(pika::LoadedDll &loadedDll, pika::PikaWindow &window, pika::LogManager &logs)
|
|
|
+{
|
|
|
+
|
|
|
+ std::this_thread::sleep_for(std::chrono::milliseconds(10)); // make sure that the compiler had enough time
|
|
|
+ //to get hold onto the dll
|
|
|
+
|
|
|
+
|
|
|
+ //pika::LoadedDll newDll;
|
|
|
+ //if (!newDll.tryToloadDllUntillPossible(loadedDll.id + 1, logs, std::chrono::seconds(1)))
|
|
|
+ //{
|
|
|
+ // logs.log("Dll reload attemp failed", pika::logWarning);
|
|
|
+ // newDll.unloadDll();
|
|
|
+ // return;
|
|
|
+ //}
|
|
|
+ //else
|
|
|
+ //{
|
|
|
+ // newDll.unloadDll();
|
|
|
+ //}
|
|
|
+ //std::this_thread::sleep_for(std::chrono::milliseconds(10)); // make sure that the dll is unloaded
|
|
|
+
|
|
|
+
|
|
|
+ auto oldContainerInfo = loadedDll.containerInfo;
|
|
|
+
|
|
|
+ if (!loadedDll.tryToloadDllUntillPossible(loadedDll.id, logs, std::chrono::seconds(5)))
|
|
|
+ {
|
|
|
+ logs.log("Couldn't reloaded dll", pika::logWarning);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ std::unordered_map<std::string, pika::ContainerInformation> containerNames;
|
|
|
+ for (auto &c : loadedDll.containerInfo)
|
|
|
+ {
|
|
|
+ containerNames[c.containerName] = c;
|
|
|
+ }
|
|
|
+
|
|
|
+ std::unordered_map<std::string, pika::ContainerInformation> oldContainerNames;
|
|
|
+ for (auto &c : oldContainerInfo)
|
|
|
+ {
|
|
|
+ oldContainerNames[c.containerName] = c;
|
|
|
+ }
|
|
|
+
|
|
|
+ //clear containers that dissapeared
|
|
|
+ {
|
|
|
+
|
|
|
+
|
|
|
+ std::vector<pika::containerId_t> containersToClean;
|
|
|
+ for (auto &i : runningContainers)
|
|
|
+ {
|
|
|
+ if (containerNames.find(i.second.baseContainerName) ==
|
|
|
+ containerNames.end())
|
|
|
+ {
|
|
|
+ std::string l = "Killed container because it does not exist anymore in dll: " + i.second.baseContainerName
|
|
|
+ + " #" + std::to_string(i.first);
|
|
|
+ logs.log(l.c_str(), pika::logError);
|
|
|
+
|
|
|
+ containersToClean.push_back(i.first);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (auto i : containersToClean)
|
|
|
+ {
|
|
|
+ forceTerminateContainer(i, loadedDll, logs);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //clear containers that changed static info
|
|
|
+ {
|
|
|
+
|
|
|
+ std::vector<pika::containerId_t> containersToClean;
|
|
|
+ for (auto &i : runningContainers)
|
|
|
+ {
|
|
|
+
|
|
|
+ auto &newContainer = containerNames[i.second.baseContainerName];
|
|
|
+ auto &oldContainer = oldContainerNames[i.second.baseContainerName];
|
|
|
+
|
|
|
+ if (newContainer != oldContainer)
|
|
|
+ {
|
|
|
+ std::string l = "Killed container because its static container info\nhas changed: "
|
|
|
+ + i.second.baseContainerName
|
|
|
+ + " #" + std::to_string(i.first);
|
|
|
+ logs.log(l.c_str(), pika::logError);
|
|
|
+
|
|
|
+ containersToClean.push_back(i.first);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ for (auto i : containersToClean)
|
|
|
+ {
|
|
|
+ forceTerminateContainer(i, loadedDll, logs);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ loadedDll.gameplayReload_(window.context);
|
|
|
+
|
|
|
+ logs.log("Reloaded dll");
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
bool pika::ContainerManager::destroyContainer(containerId_t id, pika::LoadedDll &loadedDll,
|
|
|
pika::LogManager &logManager)
|
|
|
{
|
|
|
@@ -182,6 +277,8 @@ bool pika::ContainerManager::destroyContainer(containerId_t id, pika::LoadedDll
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ auto name = c->second.baseContainerName;
|
|
|
+
|
|
|
loadedDll.bindAllocatorDllRealm(&c->second.allocator);
|
|
|
loadedDll.destructContainer_(&(c->second.pointer), &c->second.arena);
|
|
|
loadedDll.resetAllocatorDllRealm();
|
|
|
@@ -191,6 +288,8 @@ bool pika::ContainerManager::destroyContainer(containerId_t id, pika::LoadedDll
|
|
|
|
|
|
runningContainers.erase(c);
|
|
|
|
|
|
+ logManager.log((std::string("Destroyed continer: ") + name + " #" + std::to_string(id)).c_str());
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
@@ -206,11 +305,15 @@ bool pika::ContainerManager::forceTerminateContainer(containerId_t id, pika::Loa
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ auto name = c->second.baseContainerName;
|
|
|
+
|
|
|
c->second.arena.dealocateStaticMemory(); //static memory
|
|
|
free(c->second.allocator.originalBaseMemory); //heap memory
|
|
|
|
|
|
runningContainers.erase(c);
|
|
|
|
|
|
+ logManager.log((std::string("Force terminated continer: ") + name + " #" + std::to_string(id)).c_str());
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|