Search code examples
lualuac

How to run multiple instances of a lua script from C


I have the following lua script :

mydata={}
function update(val)
    mydata["x"] = val
    if (val == 10)
      -- Call C-Api(1)
    else
       --Register callback with C when free or some event happens
       register_callback(callme)
end
function callme()

end

Basically I would like to have two instances of this script running in my C program/process with out having to create a new LUA state per script. And I want to call the function update() with val = 10 from the one instance and call the function update() with val = 20 from another instance. From the second instance it registers a callback function and just waits to be called.

Basically the script file is kind of a RULE that i am trying to achieve. Several events on the system can trigger this rule or script file. I would like to process this rule as per the event that triggered it. There could be multiple events triggering this script to run at the same time. So I need to have multiple instances of this script running differentiated by the kind of event that triggered it.

To Summarize, I want each caller to have separate individual instance of mydata

I would like to achieve something like this. I read some where that we should be able to run multiple instances of a lua script with out having to create a new lua instance by loading a new environment before loading the script

But I am not able to find the exact details.

Could some body help ?


Solution

  • While I'm still not sure what exactly you are trying to achieve, but if you want to have two instances of the same function that keep the data they use private, you just need to create a closure and return an anonymous function that your C code will use.

    Something like this should work:

    function createenv(callme)
      local mydata={}
      return function (val) -- return anonymous function
        mydata["x"] = val
        if (val == 10)
          -- Call C-Api(1)
        else
           --Register callback with C when free or some event happens
           register_callback(callme)
        end
      end
    end
    

    Now in one part of your (C or Lua) code you can do:

    local update = createenv(function() --[[do whatever]] end)
    update(10)
    

    And then in another part you can do:

    local update = createenv(function() --[[do something else]] end)
    update(20)
    

    And they should have nothing in common between each other. Note that they still shared the same Lua state, but their instances of mydata will be independent of each other.