summaryrefslogtreecommitdiffstats
path: root/core/resource.cpp
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2017-01-07 18:25:37 -0300
committerJuan Linietsky <reduzio@gmail.com>2017-01-07 18:26:38 -0300
commit2ab83e1abbf5ee6d00e16056a9e9394114026f28 (patch)
tree7efbb375cc4d00d8e8589fcf1b6a1303bec5df2d /core/resource.cpp
parent2a38a5eaa844043b846e03d6655f84caf8a31e74 (diff)
downloadredot-engine-2ab83e1abbf5ee6d00e16056a9e9394114026f28.tar.gz
Memory pool vectors (DVector) have been enormously simplified in code, and renamed to PoolVector
Diffstat (limited to 'core/resource.cpp')
-rw-r--r--core/resource.cpp59
1 files changed, 49 insertions, 10 deletions
diff --git a/core/resource.cpp b/core/resource.cpp
index a503e965b0..7bcdd88891 100644
--- a/core/resource.cpp
+++ b/core/resource.cpp
@@ -164,17 +164,31 @@ void Resource::set_path(const String& p_path, bool p_take_over) {
if (path_cache!="") {
+ ResourceCache::lock->write_lock();
ResourceCache::resources.erase(path_cache);
+ ResourceCache::lock->write_unlock();
}
path_cache="";
- if (ResourceCache::resources.has( p_path )) {
+
+ ResourceCache::lock->read_lock();
+ bool has_path = ResourceCache::resources.has( p_path );
+ ResourceCache::lock->read_unlock();
+
+ if (has_path) {
if (p_take_over) {
+ ResourceCache::lock->write_lock();
ResourceCache::resources.get(p_path)->set_name("");
+ ResourceCache::lock->write_unlock();
} else {
ERR_EXPLAIN("Another resource is loaded from path: "+p_path);
- ERR_FAIL_COND( ResourceCache::resources.has( p_path ) );
+
+ ResourceCache::lock->read_lock();
+ bool exists = ResourceCache::resources.has( p_path );
+ ResourceCache::lock->read_unlock();
+
+ ERR_FAIL_COND( exists );
}
}
@@ -182,7 +196,9 @@ void Resource::set_path(const String& p_path, bool p_take_over) {
if (path_cache!="") {
+ ResourceCache::lock->write_lock();
ResourceCache::resources[path_cache]=this;;
+ ResourceCache::lock->write_unlock();
}
_change_notify("resource/path");
@@ -393,8 +409,11 @@ Resource::Resource() {
Resource::~Resource() {
- if (path_cache!="")
+ if (path_cache!="") {
+ ResourceCache::lock->write_lock();
ResourceCache::resources.erase(path_cache);
+ ResourceCache::lock->write_unlock();
+ }
if (owners.size()) {
WARN_PRINT("Resource is still owned");
}
@@ -402,18 +421,24 @@ Resource::~Resource() {
HashMap<String,Resource*> ResourceCache::resources;
+RWLock *ResourceCache::lock=NULL;
+
+void ResourceCache::setup() {
+
+ lock = RWLock::create();
+}
+
void ResourceCache::clear() {
if (resources.size())
ERR_PRINT("Resources Still in use at Exit!");
resources.clear();
+ memdelete(lock);
}
void ResourceCache::reload_externals() {
- GLOBAL_LOCK_FUNCTION
-
//const String *K=NULL;
//while ((K=resources.next(K))) {
// resources[*K]->reload_external_data();
@@ -423,15 +448,21 @@ void ResourceCache::reload_externals() {
bool ResourceCache::has(const String& p_path) {
- GLOBAL_LOCK_FUNCTION
+ lock->read_lock();;
+ bool b = resources.has(p_path);
+ lock->read_unlock();;
+
- return resources.has(p_path);
+ return b;
}
Resource *ResourceCache::get(const String& p_path) {
- GLOBAL_LOCK_FUNCTION
+ lock->read_lock();
Resource **res = resources.getptr(p_path);
+
+ lock->read_unlock();
+
if (!res) {
return NULL;
}
@@ -443,6 +474,7 @@ Resource *ResourceCache::get(const String& p_path) {
void ResourceCache::get_cached_resources(List<Ref<Resource> > *p_resources) {
+ lock->read_lock();
const String* K=NULL;
while((K=resources.next(K))) {
@@ -450,17 +482,22 @@ void ResourceCache::get_cached_resources(List<Ref<Resource> > *p_resources) {
p_resources->push_back( Ref<Resource>( r ));
}
+ lock->read_unlock();
}
int ResourceCache::get_cached_resource_count() {
- return resources.size();
+ lock->read_lock();
+ int rc = resources.size();
+ lock->read_unlock();
+
+ return rc;
}
void ResourceCache::dump(const char* p_file,bool p_short) {
#ifdef DEBUG_ENABLED
- GLOBAL_LOCK_FUNCTION
+ lock->read_lock();
Map<String,int> type_count;
@@ -500,5 +537,7 @@ void ResourceCache::dump(const char* p_file,bool p_short) {
memdelete(f);
}
+ lock->read_unlock();
+
#endif
}