[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: state of the Lua nation on resource cleanup
- From: Roberto Ierusalimschy <roberto@...>
- Date: Tue, 10 Feb 2009 21:07:31 -0200
> Besides opinions from the community, I'm hoping for some word from the
> Lua authors like one of "working on a solution", "Lua doesn't need
> improvement here", "see the need for it but don't have a design in
> mind", etc.
Later on this discussion David Manura wrote:
> Now, personally, in practice, I've only found myself wanting this time
> of capability in Lua on a few occasions (but perhaps others with
> different applications will have greater need for it):
> 
>   - closing file handles upon exceptions
>   - closing COM objects on exceptions
>   - releasing native OS handles on exceptions, e.g. as once in
>      http://lua-users.org/wiki/SerialCommunication
>   - and if I used Lua more for database and socket work, quite
> possibly that too.
I personaly agree with him. In all cases the key point is "on exceptions".
He then goes on:
> Workarounds I've used are explicit collectgarbage() calls judiciously
> placed, adding pcalls (often ugly, affects error tracebacks, and can
> conflict with coroutines), and ignoring the problem (sometimes
> acceptable).
Maybe we could avoid these workarounds by forcing a full garbage collection
upon errors. This could be added to the core or through the libraries.
(That is, pcall and other library functions that do protected calls should
call lua_gc in case of errors, and user's C code would be recommended
to do the same.)
That is, all resources should have an explicit "close" method plus
a finalizer that releases it. (Like files from the io library.)  In
regular use, the control flow should call the close method for prompt
release. On exceptions, a full collection would call the finalizers.
If needed, we could add to the library a "generic resource":
  a = newresource(func)    -- creates something
  a:close()                -- calls 'func'
If 'a' is collected before being closed, its finalizer calls 'func'.
-- Roberto