lua-users home
lua-l archive

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


It was thus said that the Great Leinen, Rick once stated:
> -----Original Message-----
> From: lua-l-bounces@lists.lua.org [mailto:lua-l-bounces@lists.lua.org] On Behalf Of Tom N Harris
> Sent: Tuesday, June 17, 2014 1:49 PM
> To: lua-l@lists.lua.org
> Subject: Re: Locking Table Member Additions
> 
> On Tuesday, June 17, 2014 05:04:29 PM Leinen, Rick wrote:
> > The Kinetis microcontroller I am targeting has 1MB of internal flash 
> > and 256KB of internal SRAM.  Neither is a lot, but I have much more 
> > flash.  By defining the table in C, I am hoping that I will be using 
> > less RAM since the Lua script will be smaller.  This may prove out to 
> > be negligible, but that is the thinking at the time.
> 
> The Lua runtime will allocate a table from the same memory pool whether the definition is made in a script or by C API calls. What you want to do is create userdata to allow scripts to access the message data in the C structures. You then have control over where that memory is allocated. You also save time by not copying data when dispatching the message.
> 
> -- 
> tom <telliamed@whoopdedo.org>
> 
> 
> Thanks Tom,
> 
> This sound like it may be a better solution.  I looked at userdata, but I
> got the impression that it allowed Lua to use a C generated types.  It
> wasn't clear to me if both Lua and C could access the data.

  It's a bit involved, as you need to handle both __index and __newindex in
C.  You can see an example here:

https://github.com/spc476/lua-conmanorg/blob/master/src/process.c#L1103

The Lua code "sees" a table with the following fields:

	{
	  core   = ... ,
	  cpu    = ... ,
	  data   = ... ,
	  fsize  = ... ,
	  nofile = ... ,
	  stack  = ... ,
	  vm     = ...
	}

It's a Lua table, but it's always empty as the metatable associated with it
hooks the __index and __newindex methods to call getrlimit() or setrlimit(). 
It could just as well be a userdata.

I do the same trick in the same file for the process id and priority:

https://github.com/spc476/lua-conmanorg/blob/master/src/process.c#L970

  __index returns both, whereas __newindex only sets the priority; it
ignores any attempt to change the process id.

  Another example is in my network wrapper for Lua:

https://github.com/spc476/lua-conmanorg/blob/master/src/net.c#L769

where I again intercept index and __newindex for a socket userdata, such as:

	sock.reuseaddr  = true
	sock.recvbuffer = 65536 --have kernel buffer up to 64k for us

such that it calls setsockopt().  Hopefully, that will give you enough
examples.

> As far as saving memory, I assumed that the same amount of memory would be
> used whether it was created in C or Lua.  I was trying to keep the size of
> the Lua script down.  When a script is passed to a Lua state, is the full
> ASCII text pulled into RAM and then parsed, or does it do it line-by-line?

  It depends on how the script is loaded, but luaL_loadfile() reads in
LUA_BUFFERSIZE bytes at a time.  LUA_BUFFERSIZE is set in lua.h.

  -spc