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);
|
||||
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 {
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@ static const bool default_reloadable = true;
|
|||
// Defined in gdnative_api_struct.gen.cpp
|
||||
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() {
|
||||
config_file.instance();
|
||||
|
@ -57,10 +57,6 @@ GDNativeLibrary::GDNativeLibrary() {
|
|||
load_once = default_load_once;
|
||||
singleton = default_singleton;
|
||||
reloadable = default_reloadable;
|
||||
|
||||
if (GDNativeLibrary::loaded_libraries == NULL) {
|
||||
GDNativeLibrary::loaded_libraries = memnew((Map<String, Vector<Ref<GDNative> > >));
|
||||
}
|
||||
}
|
||||
|
||||
GDNativeLibrary::~GDNativeLibrary() {
|
||||
|
@ -318,10 +314,10 @@ bool GDNative::initialize() {
|
|||
#endif
|
||||
|
||||
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.
|
||||
// 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;
|
||||
return true;
|
||||
}
|
||||
|
@ -377,11 +373,11 @@ bool GDNative::initialize() {
|
|||
|
||||
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;
|
||||
gdnatives.resize(1);
|
||||
gdnatives.write[0] = Ref<GDNative>(this);
|
||||
GDNativeLibrary::loaded_libraries->insert(lib_path, gdnatives);
|
||||
GDNativeLibrary::loaded_libraries.insert(lib_path, gdnatives);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -395,7 +391,7 @@ bool GDNative::terminate() {
|
|||
}
|
||||
|
||||
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) {
|
||||
// there are other GDNative's still using this library, so we actually don't terminate
|
||||
gdnatives->erase(Ref<GDNative>(this));
|
||||
|
@ -405,7 +401,7 @@ bool GDNative::terminate() {
|
|||
// we're the last one, terminate!
|
||||
gdnatives->clear();
|
||||
// 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 {
|
||||
GDCLASS(GDNativeLibrary, Resource);
|
||||
|
||||
static Map<String, Vector<Ref<GDNative> > > *loaded_libraries;
|
||||
static Map<String, Vector<Ref<GDNative> > > loaded_libraries;
|
||||
|
||||
friend class GDNativeLibraryResourceLoader;
|
||||
friend class GDNative;
|
||||
|
|
|
@ -145,6 +145,7 @@ Error ContextGL_X11::initialize() {
|
|||
break;
|
||||
}
|
||||
}
|
||||
XFree(fbc);
|
||||
ERR_FAIL_COND_V(!fbconfig, ERR_UNCONFIGURED);
|
||||
|
||||
swa.background_pixmap = None;
|
||||
|
@ -159,6 +160,7 @@ Error ContextGL_X11::initialize() {
|
|||
vi = glXGetVisualFromFBConfig(x11_display, fbc[0]);
|
||||
|
||||
fbconfig = fbc[0];
|
||||
XFree(fbc);
|
||||
}
|
||||
|
||||
int (*oldHandler)(Display *, XErrorEvent *) = XSetErrorHandler(&ctxErrorHandler);
|
||||
|
|
|
@ -410,6 +410,7 @@ Particles2D::Particles2D() {
|
|||
|
||||
particles = VS::get_singleton()->particles_create();
|
||||
|
||||
one_shot = false; // Needed so that set_emitting doesn't access uninitialized values
|
||||
set_emitting(true);
|
||||
set_one_shot(false);
|
||||
set_amount(8);
|
||||
|
|
|
@ -571,4 +571,5 @@ GIProbe::GIProbe() {
|
|||
}
|
||||
|
||||
GIProbe::~GIProbe() {
|
||||
VS::get_singleton()->free(gi_probe);
|
||||
}
|
||||
|
|
|
@ -411,6 +411,7 @@ Particles::Particles() {
|
|||
|
||||
particles = VS::get_singleton()->particles_create();
|
||||
set_base(particles);
|
||||
one_shot = false; // Needed so that set_emitting doesn't access uninitialized values
|
||||
set_emitting(true);
|
||||
set_one_shot(false);
|
||||
set_amount(8);
|
||||
|
|
|
@ -712,6 +712,7 @@ SoftBody::SoftBody() :
|
|||
}
|
||||
|
||||
SoftBody::~SoftBody() {
|
||||
PhysicsServer::get_singleton()->free(physics_rid);
|
||||
}
|
||||
|
||||
void SoftBody::reset_softbody_pin() {
|
||||
|
|
|
@ -406,6 +406,7 @@ void SkeletonIK::_notification(int p_what) {
|
|||
switch (p_what) {
|
||||
case NOTIFICATION_ENTER_TREE: {
|
||||
skeleton = Object::cast_to<Skeleton>(get_parent());
|
||||
set_process_priority(1);
|
||||
reload_chain();
|
||||
} break;
|
||||
case NOTIFICATION_INTERNAL_PROCESS: {
|
||||
|
@ -431,8 +432,6 @@ SkeletonIK::SkeletonIK() :
|
|||
skeleton(NULL),
|
||||
target_node_override(NULL),
|
||||
task(NULL) {
|
||||
|
||||
set_process_priority(1);
|
||||
}
|
||||
|
||||
SkeletonIK::~SkeletonIK() {
|
||||
|
|
|
@ -453,9 +453,6 @@ void SceneTree::init() {
|
|||
|
||||
//_quit=false;
|
||||
initialized = true;
|
||||
input_handled = false;
|
||||
|
||||
pause = false;
|
||||
|
||||
root->_set_tree(this);
|
||||
MainLoop::init();
|
||||
|
@ -1986,6 +1983,8 @@ SceneTree::SceneTree() {
|
|||
idle_process_time = 1;
|
||||
|
||||
root = NULL;
|
||||
input_handled = false;
|
||||
pause = false;
|
||||
current_frame = 0;
|
||||
current_event = 0;
|
||||
tree_changed_name = "tree_changed";
|
||||
|
|
|
@ -77,6 +77,8 @@ void VisualServerRaster::free(RID p_rid) {
|
|||
return;
|
||||
if (VSG::scene->free(p_rid))
|
||||
return;
|
||||
if (VSG::scene_render->free(p_rid))
|
||||
return;
|
||||
}
|
||||
|
||||
/* EVENT QUEUING */
|
||||
|
|
Loading…
Reference in a new issue