lua-users home
lua-l archive

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


Below is the content of a small library that simulates the behavior of software that produces asynchronous data.  This library is intended to move that data into the data space of a Lua script.
 
If the Lua function that is called in fnCallback is called directly from Lua it works, if it is called via fnCallback it fails when the table is declared for storage of the three parameters.  (see the console output near the end of this email)
 
Appologies for the length of this, it could not have been made shorter.
 
 
-- Essential code for the cb.dll -----------------------------------
static lua_State *gpLuaState = 0;  // Used by callback function to send status to the script.
static int cbNewData( lua_State * );
void fnCallback( int, int, int  );

static int cbNewData( lua_State *L )
{
 int a, b, c;
 
 a = luaL_checkint( L, 1 );
 b = luaL_checkint( L, 2 );
 c = luaL_checkint( L, 3 );
 
 fnCallback( a, b, c );
 
 return 0;
}
 
void  fnCallback( int nEvent, int nParam1, int nParam2 )
{
 int stat;
 
 if (gpLuaState != 0)
 {
  lua_getglobal( gpLuaState, "cbCallback" );
  lua_pushinteger( gpLuaState, nEvent );
  lua_pushinteger( gpLuaState, nParam1 );
  lua_pushinteger( gpLuaState, nParam2 );
 
  // do the call ( 3 arguments, no return, no error function )
  if (stat = lua_pcall( gpLuaState, 3, 0, 0 ) != 0 )
  {
   printf("eipCallback failed, code %d - %s", stat, lua_tostring(gpLuaState, -1));
   lua_pop(gpLuaState, 1);
  }
 }
 else
 {
  printf("gpLuaState was not initialized");
 }
}

static const luaL_Reg cblib[] = {
  {"write", cbNewData},
  {NULL, NULL}
};

LUALIB_API int luaopen_cb (lua_State *L) {
  gpLuaState = L;
  /* open library */
  luaL_register(L, "cb", cblib);
  return 1;
}
-- Contents of cbq.lua -----------------------------------
FAILURE = 1
SUCCESS = 0
 
q = {first = 1,
  last = 0,
  list={}
}
 
function cbCallback(event, param1, param2)
 local last = q.last + 1
 q.last = last
 print("callback",event, param1, param2)
 print(type(q.list))
 print(last)
 q.list[last] = {}
 print(type(q.list[last]))
 q.list[last][1]=event
 print(q.list[last][1])
 q.list[last][2]=param1
 print(q.list[last][2])
 q.list[last][3]=param2
 print(q.list[last][3])
end
 
function pop()
 local first = q.first
 local event, param1, param2
 
 if first > q.last then
  return FAILURE
 end
 
 event = q.list[first][1]
 param1 = q.list[first][2]
 param2 = q.list[first][3]
 print("pop",event, param1, param2)
 
 q.list[first] = nil
 q.first = first + 1
 
 return SUCCESS, event, param1, param2
end
-- Console output of test ---------------------------------------
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> require"cb"
> require"cbq"
>
> -- Direct Use
> cbCallback(12,13,14)
callback        12      13      14
table
1
table
12
13
14
> cbCallback(15,16,17)
callback        15      16      17
table
2
table
15
16
17
> print(pop())
pop     12      13      14
0       12      13      14
> print(pop())
pop     15      16      17
0       15      16      17
> print(pop())
1
> --Indirect Use
> cb.write(18,19,20)
callback        18      19      20
table
3
 
 
Thanks in advance for any suggestions.