lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


 On 16/09/2010 18:58, jgiors@threeeyessoftware.com wrote:
-------- Original Message --------
Subject: Re: Lua GC
From:<jgiors@threeeyessoftware.com>
Date: Thu, September 16, 2010 2:49 pm
To: lua-l@lists.lua.org

Andre Leiradella<andre@leiradella.com>  wrote:
Hi All,
Given the following script held in a get_t.lua file:

----------8<----------
local t = {
-- Initialization of fields in t.
}

-- Code that manipulates fields in t.

return t
----------8<----------

and the following main.lua file:

----------8<----------
local t = loadfile( 'get_t.lua' )()

-- Use t.

-- Code that runs for a long time and that doesn't
-- reference t anymore follows...
----------8<----------

Can I count on t being garbage-collected, and also the bytecode
generated by loading get_t.lua along with all local variables and
functions declared in it? Consider that main.lua will be creating
tables, strings and userdata so the GC will be triggered eventually.

I'm aware of require and stuff but since the results of get_t.lua will
be used just once I don't want it to be lying around while main.lua runs.

Thanks,

Andre
Table t will not be garbage-collected (unless there is some optimizer
magic I don't know about). t is in scope throughout the main file, and
will not be dereferenced until main.lua terminates.
Sure, I overlooked it when I typed the code. The point is, given t will be available for garbage collection, will the GC collect get_t.lua's script from memory? I could say yes from your post, but you didn't say it out loud.

Thanks,

Andre
However, there is a very simple solution. Just change your main.lua to
this:

----------8<----------
local t = loadfile( 'get_t.lua' )()

-- Use t.

t = nil     --This will dereference t.
             --You could also call collectgarbage("collect")

-- Code that runs for a long time and that doesn't
-- reference t anymore follows...
----------8<----------

An alternative is to package the operations on t into a function, which
I find "cleaner" (please excuse any typos!):

----------8<----------
local function init()
     local t = loadfile( 'get_t.lua' )()
     --Use t.
     --optional collectgarbage("collect")
end

init()

--Rest of main. t is not in scope.
----------8<----------
I made a mistake in that second version, it should be:

----------8<----------
local function init()
     local t = loadfile( 'get_t.lua' )()
     --Use t.
end

init()
--optional collectgarbage("collect") --GC HERE, NOT IN INIT()

--Rest of main. t is not in scope.
----------8<----------

Sorry for any potential confusion.

John Giors
Independent Programmer
Three Eyes Software
jgiors@ThreeEyesSoftware.com
http://www.ThreeEyesSoftware.com