Skip to content

Commit 5079ed7

Browse files
committed
Fixed resources delete errors
1 parent 4e96f0a commit 5079ed7

File tree

2 files changed

+24
-14
lines changed

2 files changed

+24
-14
lines changed

src/WaterDropEngine/WdeResourceManager/WdeResourceManager.cpp

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,32 @@ namespace wde::resource {
99
WDE_PROFILE_FUNCTION();
1010
logger::log(LogLevel::DEBUG, LogChannel::RES) << "Ticking for resource manager." << logger::endl;
1111

12-
// Delete resources that need to be deleted
13-
for (auto& res : _resourcesToDelete) {
12+
// Select resources that need to be deleted
13+
std::vector<decltype(_resourcesToDelete)::key_type> vecToDelete;
14+
for (auto&& el : _resourcesToDelete) {
1415
// Decrease ticks
15-
res.second.first--;
16+
el.second--;
1617

1718
// If no ticks remaining, delete
18-
if (res.second.first <= 0) {
19-
if (res.second.second->getReferenceCount() > 0) {
20-
_resourcesToDelete.erase(res.first);
19+
if (el.second <= 0) {
20+
// Resource not loaded or reloaded since last time
21+
if (!_resources.contains(el.first) || _resources.at(el.first)->getReferenceCount() > 0) {
22+
vecToDelete.emplace_back(el.first);
2123
continue;
2224
}
2325

24-
logger::log(LogLevel::DEBUG, LogChannel::RES) << "Releasing resource \"" << res.first << "\"." << logger::endl;
25-
_resourcesByType[res.second.second->getType()].erase(res.first);
26-
_resources.erase(res.first);
27-
_resourcesToDelete.erase(res.first);
26+
// Release resource
27+
_resourcesByType[_resources.at(el.first)->getType()].erase(el.first);
28+
_resources.erase(el.first);
29+
vecToDelete.emplace_back(el.first);
2830
}
2931
}
32+
33+
// Erase resources that need to be deleted
34+
for (auto&& key : vecToDelete) {
35+
logger::log(LogLevel::DEBUG, LogChannel::RES) << "Releasing resource \"" << key << "\"." << logger::endl;
36+
_resourcesToDelete.erase(key);
37+
}
3038
}
3139

3240
void WdeResourceManager::cleanUp() {

src/WaterDropEngine/WdeResourceManager/WdeResourceManager.hpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include <utility>
4+
#include <queue>
45

56
#include "../../wde.hpp"
67
#include "../WdeCore/Core/Module.hpp"
@@ -50,6 +51,7 @@ namespace wde::resource {
5051
* @param resource The path to the resource
5152
*/
5253
void release(const std::string& resource) {
54+
// Not loaded in memory
5355
if (!_resources.contains(resource))
5456
return;
5557

@@ -60,8 +62,8 @@ namespace wde::resource {
6062
res->decreaseReferenceCount();
6163

6264
// Release resource if it can (3 ticks remaining)
63-
if (res->getReferenceCount() <= 0)
64-
_resourcesToDelete.emplace(res->getPath(), std::pair(3, res.get()));
65+
if (res->getReferenceCount() <= 0 && !_resourcesToDelete.contains(res->getPath()))
66+
_resourcesToDelete.emplace(res->getPath(), 3);
6567
}
6668

6769

@@ -77,7 +79,7 @@ namespace wde::resource {
7779
std::unordered_map<std::string, std::shared_ptr<Resource>> _resources {};
7880
/** Resources list by type */
7981
std::unordered_map<Resource::ResourceType, std::unordered_map<std::string, std::shared_ptr<Resource>>> _resourcesByType {};
80-
/** Resources list that needs to be deleted by path (name - (tickRemainingBeforeDeleting, Resource*)) */
81-
std::unordered_map<std::string, std::pair<int, Resource*>> _resourcesToDelete {};
82+
/** Resources list that needs to be deleted by path (name - tickRemainingBeforeDeleting) */
83+
std::unordered_map<std::string, int> _resourcesToDelete {};
8284
};
8385
}

0 commit comments

Comments
 (0)