From f2426658d8b2e8cc417a9faa80b7e611de30ecda Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Tue, 8 Mar 2011 00:47:26 +0000 Subject: added mutli threaded environment calling qlistener and tcpserver threads diff --git a/nopsyncd/nopsyncd.c b/nopsyncd/nopsyncd.c index 61003fb..b8907ee 100644 --- a/nopsyncd/nopsyncd.c +++ b/nopsyncd/nopsyncd.c @@ -28,14 +28,117 @@ #include #include +#define LUA_MAIN_LOOP_FUNC "main_loop" +static const luaL_Reg nopsyncd_lualibs[] = { + {"", luaopen_base}, + {LUA_LOADLIBNAME, luaopen_package}, + {LUA_TABLIBNAME, luaopen_table}, + {LUA_STRLIBNAME, luaopen_string}, + {LUA_MATHLIBNAME, luaopen_math}, + {NULL, NULL} +}; + +int init_main_loop(lua_State *L, const char* filename) +{ + const luaL_Reg *lib = nopsyncd_lualibs; + for (; lib->func; lib++) { + lua_pushcfunction(L, lib->func); + lua_pushstring(L, lib->name); + lua_call(L, 1, 0); + } + + int ret = luaL_loadfile(L, filename); + if(ret) { + const char* err_str = luaL_checkstring(L, -1); + switch(ret) { + case LUA_ERRSYNTAX: fprintf(stderr, "luaL_loadfile() syntax error: %s\n", err_str); break; + case LUA_ERRMEM: fprintf(stderr, "luaL_loadfile() malloc error: %s\n", err_str); break; + case LUA_ERRFILE: fprintf(stderr, "lauL_loadfile() error: %s\n", err_str); break; + default: fprintf(stderr, "luaL_loadfile() unknown error: %s\n", err_str); break; + } + return -1; + } + + ret = lua_pcall(L, 0, 0, 0); + if(ret) { + const char* err_str = luaL_checkstring(L, -1); + switch(ret) { + case LUA_ERRRUN: fprintf(stderr, "lua_pcall() runtime error: %s\n", err_str); break; + case LUA_ERRMEM: fprintf(stderr, "lua_pcall() malloc error: %s\n", err_str); break; + case LUA_ERRERR: fprintf(stderr, "lua_pcall() error at error handler function: %s\n", err_str); break; + } + return -1; + } + + return 0; +} + +int call_main_loop(lua_State* L, const char* filename) +{ + lua_getglobal(L, LUA_MAIN_LOOP_FUNC); + if(!lua_isfunction(L, -1)) { + fprintf(stderr, "there is no function '%s' at file '%s'\n", LUA_MAIN_LOOP_FUNC, filename); + return -1; + }; + + int ret = lua_pcall(L, 0, 1, 0); + if(ret) { + const char* err_str = luaL_checkstring(L, -1); + switch(ret) { + case LUA_ERRRUN: fprintf(stderr, "lua_pcall(%s:%s) runtime error: %s\n", filename, LUA_MAIN_LOOP_FUNC, err_str); break; + case LUA_ERRMEM: fprintf(stderr, "lua_pcall(%s:%s) malloc error: %s\n", filename, LUA_MAIN_LOOP_FUNC, err_str); break; + case LUA_ERRERR: fprintf(stderr, "lua_pcall(%s:%s) error at error handler function: %s\n", filename, LUA_MAIN_LOOP_FUNC, err_str); break; + } + return -1; + } + + ret = lua_tointeger(L, 1); + return ret; +} + +void* main_loop(void* file) +{ + if(!file) + pthread_exit(NULL); + + + lua_State *L; + L = luaL_newstate(); + if(!L) { + fprintf(stderr, "error creating lua state\n"); + pthread_exit(NULL); + } + + int ret = init_main_loop(L, (char*)file); + if(!ret) + ret = call_main_loop(L, (char*)file); + + lua_close(L); + + pthread_exit(NULL); +} int main(int argc, char* argv[]) { printf("starting nopsyncd...\n"); - + pthread_t qlistener, tcpserver; + + int ret = pthread_create(&qlistener, NULL, main_loop, "qlistener.lua"); + if(ret) { + fprintf(stderr, "Error creating qlistener thread (code: %d)\n", ret); + return 1; + } + + ret = pthread_create(&tcpserver, NULL, main_loop, "tcpserver.lua"); + if(ret) { + fprintf(stderr, "Error creating qlistener thread (code: %d)\n", ret); + return 1; + } + pthread_join(qlistener, NULL); + pthread_join(tcpserver, NULL); printf("stopping nopsyncd.\n"); return 0; diff --git a/nopsyncd/qlistener.lua b/nopsyncd/qlistener.lua new file mode 100755 index 0000000..c850cc6 --- /dev/null +++ b/nopsyncd/qlistener.lua @@ -0,0 +1,42 @@ +-- +-- rhnop +-- +-- Copyright (C) 2011 Christian Pointner +-- +-- This file is part of rhnop. +-- +-- rhnop is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- any later version. +-- +-- rhnop is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with rhnop. If not, see . +-- + +local queue_name = "/rhnop" + +mq = require "luamq" + +function main_loop() + local q, err = mq.create(queue_name, "ro") + if q == nil then + io.stderr:write("creation of message queue failed: " .. err .. "\n") + os.exit(1) + end + + --while true do + local msg, prio = mq.receive(q) + if msg == nil then + io.stderr:write("recv error: " .. prio .. "\n") + os.exit(2) + end + + print("received message '" .. msg .. "' with prio: " .. prio) + --end +end \ No newline at end of file diff --git a/nopsyncd/tcpserver.lua b/nopsyncd/tcpserver.lua new file mode 100755 index 0000000..e7df4e5 --- /dev/null +++ b/nopsyncd/tcpserver.lua @@ -0,0 +1,26 @@ +-- +-- rhnop +-- +-- Copyright (C) 2011 Christian Pointner +-- +-- This file is part of rhnop. +-- +-- rhnop is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- any later version. +-- +-- rhnop is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with rhnop. If not, see . +-- +require "socket" + + +function main_loop() + socket.select(nil, nil, 10) +end \ No newline at end of file -- cgit v0.10.2