]> git.mxchange.org Git - flightgear.git/commitdiff
Fix memory leak introduced when we stopped using _context for script
authorandy <andy>
Wed, 24 Oct 2007 18:07:02 +0000 (18:07 +0000)
committerandy <andy>
Wed, 24 Oct 2007 18:07:02 +0000 (18:07 +0000)
invocations, but left it in place for miscellaneous allocation work.
Contexts cache allocated objects in a temps vector and only clear it
out when they are used.

Also, fix a type warning while I'm in there.

src/Scripting/NasalSys.cxx

index c1e865f04fad536c7b302aa18bbd6d8ba007af57..ca9700863db9f55b5a0ce3c487ecbb51a4ccad17 100644 (file)
@@ -674,6 +674,19 @@ void FGNasalSys::update(double)
         for(it = _dead_listener.begin(); it != end; ++it) delete *it;
         _dead_listener.clear();
     }
+
+    // The global context is a legacy thing.  We use dynamically
+    // created contexts for naCall() now, so that we can call them
+    // recursively.  But there are still spots that want to use it for
+    // naNew*() calls, which end up leaking memory because the context
+    // only clears out its temporary vector when it's *used*.  So just
+    // junk it and fetch a new/reinitialized one every frame.  This is
+    // clumsy: the right solution would use the dynamic context in all
+    // cases and eliminate _context entirely.  But that's more work,
+    // and this works fine (yes, they say "New" and "Free", but
+    // they're very fast, just trust me). -Andy
+    naFreeContext(_context);
+    _context = naNewContext();
 }
 
 // Loads the scripts found under /nasal in the global tree
@@ -932,7 +945,7 @@ naRef FGNasalSys::setListener(naContext c, int argc, naRef* args)
         return naNil();
     }
 
-    int type = argc > 3 && naIsNum(args[3]) ? args[3].num : 1;
+    int type = argc > 3 && naIsNum(args[3]) ? (int)args[3].num : 1;
     FGNasalListener *nl = new FGNasalListener(node, code, this,
             gcSave(code), _listenerId, type);