summaryrefslogtreecommitdiff
path: root/modules/mono
diff options
context:
space:
mode:
authorRĂ©mi Verschelde <rverschelde@gmail.com>2020-01-23 23:06:58 +0100
committerGitHub <noreply@github.com>2020-01-23 23:06:58 +0100
commit55f580b24a696089dc1bda7dbfb14b3e63de23f0 (patch)
tree42a406efe17d0848b6737b5c9c62bc2f8d9c27ea /modules/mono
parent2e27e746499888b1a9d2dd37ddd5e29f36b2831d (diff)
parent55b2e58a98697f9d65fa1dd41cd4ae8184213f43 (diff)
Merge pull request #35491 from neikeq/issue-35450
Mono/C#: Lighten up unsafe reference checks
Diffstat (limited to 'modules/mono')
-rw-r--r--modules/mono/csharp_script.cpp27
-rw-r--r--modules/mono/csharp_script.h5
2 files changed, 25 insertions, 7 deletions
diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp
index 210267e681..3d868b0839 100644
--- a/modules/mono/csharp_script.cpp
+++ b/modules/mono/csharp_script.cpp
@@ -160,7 +160,7 @@ void CSharpLanguage::finish() {
script_bindings.clear();
#ifdef DEBUG_ENABLED
- for (List<ObjectID>::Element *E = unsafely_referenced_objects.front(); E; E = E->next()) {
+ for (Map<ObjectID, int>::Element *E = unsafe_object_references.front(); E; E = E->next()) {
const ObjectID &id = E->get();
Object *obj = ObjectDB::get_instance(id);
@@ -632,18 +632,20 @@ Vector<ScriptLanguage::StackInfo> CSharpLanguage::stack_trace_get_info(MonoObjec
void CSharpLanguage::post_unsafe_reference(Object *p_obj) {
#ifdef DEBUG_ENABLED
+ SCOPED_MUTEX_LOCK(unsafe_object_references_lock);
ObjectID id = p_obj->get_instance_id();
- ERR_FAIL_COND_MSG(unsafely_referenced_objects.find(id), "Multiple unsafe references for object: " + p_obj->get_class() + ":" + itos(id));
- unsafely_referenced_objects.push_back(id);
+ unsafe_object_references[id]++;
#endif
}
void CSharpLanguage::pre_unsafe_unreference(Object *p_obj) {
#ifdef DEBUG_ENABLED
+ SCOPED_MUTEX_LOCK(unsafe_object_references_lock);
ObjectID id = p_obj->get_instance_id();
- List<ObjectID>::Element *elem = unsafely_referenced_objects.find(id);
+ Map<ObjectID, int>::Element *elem = unsafe_object_references.find(id);
ERR_FAIL_NULL(elem);
- unsafely_referenced_objects.erase(elem);
+ if (--elem->value() == 0)
+ unsafe_object_references.erase(elem);
#endif
}
@@ -1246,6 +1248,14 @@ CSharpLanguage::CSharpLanguage() {
language_bind_mutex = Mutex::create();
#endif
+#ifdef DEBUG_ENABLED
+#ifdef NO_THREADS
+ unsafe_object_references_lock = NULL;
+#else
+ unsafe_object_references_lock = Mutex::create();
+#endif
+#endif
+
lang_idx = -1;
scripts_metadata_invalidated = true;
@@ -1274,6 +1284,13 @@ CSharpLanguage::~CSharpLanguage() {
script_gchandle_release_mutex = NULL;
}
+#ifdef DEBUG_ENABLED
+ if (unsafe_object_references_lock) {
+ memdelete(unsafe_object_references_lock);
+ unsafe_object_references_lock = NULL;
+ }
+#endif
+
singleton = NULL;
}
diff --git a/modules/mono/csharp_script.h b/modules/mono/csharp_script.h
index 30f56e00bd..f244bc4119 100644
--- a/modules/mono/csharp_script.h
+++ b/modules/mono/csharp_script.h
@@ -308,8 +308,9 @@ class CSharpLanguage : public ScriptLanguage {
Map<Object *, CSharpScriptBinding> script_bindings;
#ifdef DEBUG_ENABLED
- // List of unsafely referenced objects
- List<ObjectID> unsafely_referenced_objects;
+ // List of unsafe object references
+ Map<ObjectID, int> unsafe_object_references;
+ Mutex *unsafe_object_references_lock;
#endif
struct StringNameCache {