From 4d6a4eb836696ce774381c93c7b1d7c112b116e0 Mon Sep 17 00:00:00 2001 From: Mathias Froehlich <Mathias.Froehlich@web.de> Date: Tue, 24 Apr 2012 23:23:09 +0200 Subject: [PATCH] Fix explicit reference counting with waypoints and positions. --- src/Scripting/NasalPositioned.cxx | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/Scripting/NasalPositioned.cxx b/src/Scripting/NasalPositioned.cxx index 78e1bc8d7..3714d4369 100644 --- a/src/Scripting/NasalPositioned.cxx +++ b/src/Scripting/NasalPositioned.cxx @@ -47,9 +47,10 @@ #include <Autopilot/route_mgr.hxx> #include <Navaids/procedure.hxx> -static void sgrefGhostDestroy(void* g); -naGhostType PositionedGhostType = { sgrefGhostDestroy, "positioned" }; -naGhostType WayptGhostType = { sgrefGhostDestroy, "waypoint" }; +static void positionedGhostDestroy(void* g); +static void wayptGhostDestroy(void* g); +naGhostType PositionedGhostType = { positionedGhostDestroy, "positioned" }; +naGhostType WayptGhostType = { wayptGhostDestroy, "waypoint" }; static void hashset(naContext c, naRef hash, const char* key, naRef val) { @@ -72,6 +73,13 @@ static FGPositioned* positionedGhost(naRef r) return 0; } +static void positionedGhostDestroy(void* g) +{ + FGPositioned* pos = (FGPositioned*)g; + if (!FGPositioned::put(pos)) // unref + delete pos; +} + static flightgear::Waypt* wayptGhost(naRef r) { if (naGhost_type(r) == &WayptGhostType) @@ -79,10 +87,11 @@ static flightgear::Waypt* wayptGhost(naRef r) return 0; } -static void sgrefGhostDestroy(void* g) +static void wayptGhostDestroy(void* g) { - SGReferenced* ref = (SGReferenced*)g; - SGReferenced::put(ref); // unref + flightgear::Waypt* wpt = (flightgear::Waypt*)g; + if (!flightgear::Waypt::put(wpt)) // unref + delete wpt; } static naRef airportPrototype; @@ -95,7 +104,7 @@ naRef ghostForPositioned(naContext c, const FGPositioned* pos) return naNil(); } - SGReferenced::get(pos); // take a ref + FGPositioned::get(pos); // take a ref return naNewGhost(c, &PositionedGhostType, (void*) pos); } @@ -105,7 +114,7 @@ naRef ghostForWaypt(naContext c, const flightgear::Waypt* wpt) return naNil(); } - SGReferenced::get(wpt); // take a ref + flightgear::Waypt::get(wpt); // take a ref return naNewGhost(c, &WayptGhostType, (void*) wpt); }