Fix various memory leaks and errors
This commit is contained in:
parent
4cb0887660
commit
f7dad789e9
11 changed files with 33 additions and 17 deletions
|
@ -4990,6 +4990,20 @@ bool RasterizerSceneGLES3::free(RID p_rid) {
|
||||||
reflection_probe_instance_owner.free(p_rid);
|
reflection_probe_instance_owner.free(p_rid);
|
||||||
memdelete(reflection_instance);
|
memdelete(reflection_instance);
|
||||||
|
|
||||||
|
} else if (environment_owner.owns(p_rid)) {
|
||||||
|
|
||||||
|
Environment *environment = environment_owner.get(p_rid);
|
||||||
|
|
||||||
|
environment_owner.free(p_rid);
|
||||||
|
memdelete(environment);
|
||||||
|
|
||||||
|
} else if (gi_probe_instance_owner.owns(p_rid)) {
|
||||||
|
|
||||||
|
GIProbeInstance *gi_probe_instance = gi_probe_instance_owner.get(p_rid);
|
||||||
|
|
||||||
|
gi_probe_instance_owner.free(p_rid);
|
||||||
|
memdelete(gi_probe_instance);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ static const bool default_reloadable = true;
|
||||||
// Defined in gdnative_api_struct.gen.cpp
|
// Defined in gdnative_api_struct.gen.cpp
|
||||||
extern const godot_gdnative_core_api_struct api_struct;
|
extern const godot_gdnative_core_api_struct api_struct;
|
||||||
|
|
||||||
Map<String, Vector<Ref<GDNative> > > *GDNativeLibrary::loaded_libraries = NULL;
|
Map<String, Vector<Ref<GDNative> > > GDNativeLibrary::loaded_libraries;
|
||||||
|
|
||||||
GDNativeLibrary::GDNativeLibrary() {
|
GDNativeLibrary::GDNativeLibrary() {
|
||||||
config_file.instance();
|
config_file.instance();
|
||||||
|
@ -57,10 +57,6 @@ GDNativeLibrary::GDNativeLibrary() {
|
||||||
load_once = default_load_once;
|
load_once = default_load_once;
|
||||||
singleton = default_singleton;
|
singleton = default_singleton;
|
||||||
reloadable = default_reloadable;
|
reloadable = default_reloadable;
|
||||||
|
|
||||||
if (GDNativeLibrary::loaded_libraries == NULL) {
|
|
||||||
GDNativeLibrary::loaded_libraries = memnew((Map<String, Vector<Ref<GDNative> > >));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GDNativeLibrary::~GDNativeLibrary() {
|
GDNativeLibrary::~GDNativeLibrary() {
|
||||||
|
@ -318,10 +314,10 @@ bool GDNative::initialize() {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (library->should_load_once()) {
|
if (library->should_load_once()) {
|
||||||
if (GDNativeLibrary::loaded_libraries->has(lib_path)) {
|
if (GDNativeLibrary::loaded_libraries.has(lib_path)) {
|
||||||
// already loaded. Don't load again.
|
// already loaded. Don't load again.
|
||||||
// copy some of the stuff instead
|
// copy some of the stuff instead
|
||||||
this->native_handle = (*GDNativeLibrary::loaded_libraries)[lib_path][0]->native_handle;
|
this->native_handle = GDNativeLibrary::loaded_libraries[lib_path][0]->native_handle;
|
||||||
initialized = true;
|
initialized = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -377,11 +373,11 @@ bool GDNative::initialize() {
|
||||||
|
|
||||||
initialized = true;
|
initialized = true;
|
||||||
|
|
||||||
if (library->should_load_once() && !GDNativeLibrary::loaded_libraries->has(lib_path)) {
|
if (library->should_load_once() && !GDNativeLibrary::loaded_libraries.has(lib_path)) {
|
||||||
Vector<Ref<GDNative> > gdnatives;
|
Vector<Ref<GDNative> > gdnatives;
|
||||||
gdnatives.resize(1);
|
gdnatives.resize(1);
|
||||||
gdnatives.write[0] = Ref<GDNative>(this);
|
gdnatives.write[0] = Ref<GDNative>(this);
|
||||||
GDNativeLibrary::loaded_libraries->insert(lib_path, gdnatives);
|
GDNativeLibrary::loaded_libraries.insert(lib_path, gdnatives);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -395,7 +391,7 @@ bool GDNative::terminate() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (library->should_load_once()) {
|
if (library->should_load_once()) {
|
||||||
Vector<Ref<GDNative> > *gdnatives = &(*GDNativeLibrary::loaded_libraries)[library->get_current_library_path()];
|
Vector<Ref<GDNative> > *gdnatives = &GDNativeLibrary::loaded_libraries[library->get_current_library_path()];
|
||||||
if (gdnatives->size() > 1) {
|
if (gdnatives->size() > 1) {
|
||||||
// there are other GDNative's still using this library, so we actually don't terminate
|
// there are other GDNative's still using this library, so we actually don't terminate
|
||||||
gdnatives->erase(Ref<GDNative>(this));
|
gdnatives->erase(Ref<GDNative>(this));
|
||||||
|
@ -405,7 +401,7 @@ bool GDNative::terminate() {
|
||||||
// we're the last one, terminate!
|
// we're the last one, terminate!
|
||||||
gdnatives->clear();
|
gdnatives->clear();
|
||||||
// whew this looks scary, but all it does is remove the entry completely
|
// whew this looks scary, but all it does is remove the entry completely
|
||||||
GDNativeLibrary::loaded_libraries->erase(GDNativeLibrary::loaded_libraries->find(library->get_current_library_path()));
|
GDNativeLibrary::loaded_libraries.erase(GDNativeLibrary::loaded_libraries.find(library->get_current_library_path()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ class GDNative;
|
||||||
class GDNativeLibrary : public Resource {
|
class GDNativeLibrary : public Resource {
|
||||||
GDCLASS(GDNativeLibrary, Resource);
|
GDCLASS(GDNativeLibrary, Resource);
|
||||||
|
|
||||||
static Map<String, Vector<Ref<GDNative> > > *loaded_libraries;
|
static Map<String, Vector<Ref<GDNative> > > loaded_libraries;
|
||||||
|
|
||||||
friend class GDNativeLibraryResourceLoader;
|
friend class GDNativeLibraryResourceLoader;
|
||||||
friend class GDNative;
|
friend class GDNative;
|
||||||
|
|
|
@ -145,6 +145,7 @@ Error ContextGL_X11::initialize() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
XFree(fbc);
|
||||||
ERR_FAIL_COND_V(!fbconfig, ERR_UNCONFIGURED);
|
ERR_FAIL_COND_V(!fbconfig, ERR_UNCONFIGURED);
|
||||||
|
|
||||||
swa.background_pixmap = None;
|
swa.background_pixmap = None;
|
||||||
|
@ -159,6 +160,7 @@ Error ContextGL_X11::initialize() {
|
||||||
vi = glXGetVisualFromFBConfig(x11_display, fbc[0]);
|
vi = glXGetVisualFromFBConfig(x11_display, fbc[0]);
|
||||||
|
|
||||||
fbconfig = fbc[0];
|
fbconfig = fbc[0];
|
||||||
|
XFree(fbc);
|
||||||
}
|
}
|
||||||
|
|
||||||
int (*oldHandler)(Display *, XErrorEvent *) = XSetErrorHandler(&ctxErrorHandler);
|
int (*oldHandler)(Display *, XErrorEvent *) = XSetErrorHandler(&ctxErrorHandler);
|
||||||
|
|
|
@ -410,6 +410,7 @@ Particles2D::Particles2D() {
|
||||||
|
|
||||||
particles = VS::get_singleton()->particles_create();
|
particles = VS::get_singleton()->particles_create();
|
||||||
|
|
||||||
|
one_shot = false; // Needed so that set_emitting doesn't access uninitialized values
|
||||||
set_emitting(true);
|
set_emitting(true);
|
||||||
set_one_shot(false);
|
set_one_shot(false);
|
||||||
set_amount(8);
|
set_amount(8);
|
||||||
|
|
|
@ -571,4 +571,5 @@ GIProbe::GIProbe() {
|
||||||
}
|
}
|
||||||
|
|
||||||
GIProbe::~GIProbe() {
|
GIProbe::~GIProbe() {
|
||||||
|
VS::get_singleton()->free(gi_probe);
|
||||||
}
|
}
|
||||||
|
|
|
@ -411,6 +411,7 @@ Particles::Particles() {
|
||||||
|
|
||||||
particles = VS::get_singleton()->particles_create();
|
particles = VS::get_singleton()->particles_create();
|
||||||
set_base(particles);
|
set_base(particles);
|
||||||
|
one_shot = false; // Needed so that set_emitting doesn't access uninitialized values
|
||||||
set_emitting(true);
|
set_emitting(true);
|
||||||
set_one_shot(false);
|
set_one_shot(false);
|
||||||
set_amount(8);
|
set_amount(8);
|
||||||
|
|
|
@ -712,6 +712,7 @@ SoftBody::SoftBody() :
|
||||||
}
|
}
|
||||||
|
|
||||||
SoftBody::~SoftBody() {
|
SoftBody::~SoftBody() {
|
||||||
|
PhysicsServer::get_singleton()->free(physics_rid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoftBody::reset_softbody_pin() {
|
void SoftBody::reset_softbody_pin() {
|
||||||
|
|
|
@ -406,6 +406,7 @@ void SkeletonIK::_notification(int p_what) {
|
||||||
switch (p_what) {
|
switch (p_what) {
|
||||||
case NOTIFICATION_ENTER_TREE: {
|
case NOTIFICATION_ENTER_TREE: {
|
||||||
skeleton = Object::cast_to<Skeleton>(get_parent());
|
skeleton = Object::cast_to<Skeleton>(get_parent());
|
||||||
|
set_process_priority(1);
|
||||||
reload_chain();
|
reload_chain();
|
||||||
} break;
|
} break;
|
||||||
case NOTIFICATION_INTERNAL_PROCESS: {
|
case NOTIFICATION_INTERNAL_PROCESS: {
|
||||||
|
@ -431,8 +432,6 @@ SkeletonIK::SkeletonIK() :
|
||||||
skeleton(NULL),
|
skeleton(NULL),
|
||||||
target_node_override(NULL),
|
target_node_override(NULL),
|
||||||
task(NULL) {
|
task(NULL) {
|
||||||
|
|
||||||
set_process_priority(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SkeletonIK::~SkeletonIK() {
|
SkeletonIK::~SkeletonIK() {
|
||||||
|
|
|
@ -453,9 +453,6 @@ void SceneTree::init() {
|
||||||
|
|
||||||
//_quit=false;
|
//_quit=false;
|
||||||
initialized = true;
|
initialized = true;
|
||||||
input_handled = false;
|
|
||||||
|
|
||||||
pause = false;
|
|
||||||
|
|
||||||
root->_set_tree(this);
|
root->_set_tree(this);
|
||||||
MainLoop::init();
|
MainLoop::init();
|
||||||
|
@ -1986,6 +1983,8 @@ SceneTree::SceneTree() {
|
||||||
idle_process_time = 1;
|
idle_process_time = 1;
|
||||||
|
|
||||||
root = NULL;
|
root = NULL;
|
||||||
|
input_handled = false;
|
||||||
|
pause = false;
|
||||||
current_frame = 0;
|
current_frame = 0;
|
||||||
current_event = 0;
|
current_event = 0;
|
||||||
tree_changed_name = "tree_changed";
|
tree_changed_name = "tree_changed";
|
||||||
|
|
|
@ -77,6 +77,8 @@ void VisualServerRaster::free(RID p_rid) {
|
||||||
return;
|
return;
|
||||||
if (VSG::scene->free(p_rid))
|
if (VSG::scene->free(p_rid))
|
||||||
return;
|
return;
|
||||||
|
if (VSG::scene_render->free(p_rid))
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* EVENT QUEUING */
|
/* EVENT QUEUING */
|
||||||
|
|
Loading…
Reference in a new issue