Browse Source

GDExtension: Save and compare modification times separately for reload

David Snopek 1 year ago
parent
commit
f86054e3a0
2 changed files with 13 additions and 8 deletions
  1. 8 5
      core/extension/gdextension.cpp
  2. 5 3
      core/extension/gdextension.h

+ 8 - 5
core/extension/gdextension.cpp

@@ -915,9 +915,9 @@ Error GDExtensionResourceLoader::load_gdextension_resource(const String &p_path,
 #ifdef TOOLS_ENABLED
 	p_extension->set_reloadable(config->get_value("configuration", "reloadable", false) && Engine::get_singleton()->is_extension_reloading_enabled());
 
-	p_extension->update_last_modified_time(MAX(
-			FileAccess::get_modified_time(library_path),
-			FileAccess::get_modified_time(p_path)));
+	p_extension->update_last_modified_time(
+			FileAccess::get_modified_time(p_path),
+			FileAccess::get_modified_time(library_path));
 #endif
 
 	err = p_extension->open_library(library_path, entry_symbol);
@@ -990,10 +990,13 @@ String GDExtensionResourceLoader::get_resource_type(const String &p_path) const
 
 #ifdef TOOLS_ENABLED
 bool GDExtension::has_library_changed() const {
-	if (FileAccess::get_modified_time(get_path()) > last_modified_time) {
+	// Check only that the last modified time is different (rather than checking
+	// that it's newer) since some OS's (namely Windows) will preserve the modified
+	// time by default when copying files.
+	if (FileAccess::get_modified_time(get_path()) != resource_last_modified_time) {
 		return true;
 	}
-	if (FileAccess::get_modified_time(library_path) > last_modified_time) {
+	if (FileAccess::get_modified_time(library_path) != library_last_modified_time) {
 		return true;
 	}
 	return false;

+ 5 - 3
core/extension/gdextension.h

@@ -90,7 +90,8 @@ class GDExtension : public Resource {
 	int32_t level_initialized = -1;
 
 #ifdef TOOLS_ENABLED
-	uint64_t last_modified_time = 0;
+	uint64_t resource_last_modified_time = 0;
+	uint64_t library_last_modified_time = 0;
 	bool is_reloading = false;
 	Vector<GDExtensionMethodBind *> invalid_methods;
 	Vector<ObjectID> instance_bindings;
@@ -140,8 +141,9 @@ public:
 	void set_reloadable(bool p_reloadable) { reloadable = p_reloadable; }
 
 	bool has_library_changed() const;
-	void update_last_modified_time(uint64_t p_last_modified_time) {
-		last_modified_time = MAX(last_modified_time, p_last_modified_time);
+	void update_last_modified_time(uint64_t p_resource_last_modified_time, uint64_t p_library_last_modified_time) {
+		resource_last_modified_time = p_resource_last_modified_time;
+		library_last_modified_time = p_library_last_modified_time;
 	}
 
 	void track_instance_binding(Object *p_object);