lua-users home
lua-l archive

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


On Wednesday 07, Geoff Leyland wrote:
> On 7/10/2009, at 11:08 PM, Robert G. Jakabosky wrote:
> > On Wednesday 07, Geoff Leyland wrote:
> >> On 7/10/2009, at 10:24 PM, Jerome Vuarand wrote:
> >>> 2009/10/7 Geoff Leyland <geoff_leyland@fastmail.fm>:
> >>>> Is there a way to return an exit code from a Lua script without
> >>>> calling
> >>>> os.exit()?
> >>>>
> >>>> I'm using luacov, and if you call os.exit(), it doesn't write any
> >>>> statistics.  I'd also like my script to return 1 or 0.  As far as I
> >>>> can
> >>>> tell, the return value from a top-level script does not seem to be
> >>>> used for
> >>>> an exit code, but hopefully someone can tell me I'm wrong.
> >>>
> >>> Looking at the code in lua.c, it seems the return value of the
> >>> script
> >>> is ignored. It should be easy to patch if a custom Lua executable is
> >>> an option to you.
> >>
> >> Thanks, I thought someone might say that.  Shame really, it'd be a
> >> nice feature to have in standard Lua (mind you this is the first time
> >> it's come up in a good few years of using Lua)
> >
> > luacov should wrap os.exit() and dump that stats before calling the
> > normal
> > os.exit().
> >
> > I don't know much about how luacov is implemented, but if they have
> > a function
> > that can be called from Lua to dump the stats, then you can write a
> > custom
> > os.exit() wrapper:
> >
> > local exit=os.exit
> > os.exit = function(...)
> >  luacov.dumpstats() -- I don't know if a funciton like this exists.
> >  exit(...)
> > end
>
> luacov does a trick with gc and a temporary file to get its save_stats
> called on exit:
>
> local luacovlock = os.tmpname()
>
> function on_exit()
>     os.remove(luacovlock)
>     stats.save_stats(data, statsfile)
>     stats.stop_stats(statsfile)
> end
>
> on_exit_trick = io.open(luacovlock, "w")
> debug.setmetatable(on_exit_trick, { __gc = on_exit } )
>
> This doesn't seem to happen on os.exit() - I guess os.exit() forces
> shutdown without gc?
>
> I could call luacov's save_stats directly or I could use luacov's tick
> facility, but I only use luacov sometimes, as lua -lluacov on the
> command line, so it would be nice to have my script know nothing about
> luacov, and still be able to return a 0 or 1.  And it so nearly works.

Put this in "luacov_on_exit.lua":
--- start
require('luacov')
local luacovlock = os.tmpname()
function on_exit()
    os.remove(luacovlock)
    stats.save_stats(data, statsfile)
    stats.stop_stats(statsfile)
end
on_exit_trick = io.open(luacovlock, "w")
debug.setmetatable(on_exit_trick, { __gc = on_exit } )
local exit=os.exit
os.exit = function(...)
  on_exit()
  exit(...)
end
--- end

Then run your program with:
lua -lluacov_on_exit script.lua

-- 
Robert G. Jakabosky