From d63bb833df7f1d48184c69e0f3a0199fe809d4e8 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sat, 18 Dec 2010 20:52:25 +0000 Subject: added bogus check timout to command queue command without expected response completed after sent added timer utility library git-svn-id: https://svn.spreadspace.org/gcsd/trunk@65 ac14a137-c7f1-4531-abe0-07747231d213 --- src/Makefile | 1 + src/command_queue.lua | 10 ++++- src/gcsd.c | 2 + src/l_timer.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/l_timer.h | 41 +++++++++++++++++ src/main_loop.lua | 1 + 6 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 src/l_timer.c create mode 100644 src/l_timer.h diff --git a/src/Makefile b/src/Makefile index 358fb85..9f73187 100644 --- a/src/Makefile +++ b/src/Makefile @@ -46,6 +46,7 @@ C_OBJS := log.o \ l_sig_handler.o \ l_rawio.o \ l_util.o \ + l_timer.o \ gcsd.o C_SRCS := $(C_OBJS:%.o=%.c) diff --git a/src/command_queue.lua b/src/command_queue.lua index d63fa26..a1aa383 100644 --- a/src/command_queue.lua +++ b/src/command_queue.lua @@ -69,7 +69,15 @@ function command_queue:command_sent() if(self.current == nil) then return end self.current.sent = true - return self.current.expected_response + if(self.current.expected_response) then + return self.current.expected_response + end + + self:command_completed() +end + +function command_queue:check_timeout() + if(self.current == nil or not self.current.sent) then return end end function command_queue:command_completed() diff --git a/src/gcsd.c b/src/gcsd.c index d25c13a..4fedaf3 100644 --- a/src/gcsd.c +++ b/src/gcsd.c @@ -44,6 +44,7 @@ #include "log.h" #include "l_rawio.h" #include "l_util.h" +#include "l_timer.h" #include "l_log.h" #include "l_sig_handler.h" @@ -64,6 +65,7 @@ static const luaL_Reg gcsd_lualibs[] = { {LUA_MATHLIBNAME, luaopen_math}, {LUA_RAWIOLIBNAME, luaopen_rawio}, {LUA_UTILLIBNAME, luaopen_util}, + {LUA_TIMERLIBNAME, luaopen_timer}, {LUA_LOGLIBNAME, luaopen_log}, {LUA_SIGNALLIBNAME, luaopen_signal}, {NULL, NULL} diff --git a/src/l_timer.c b/src/l_timer.c new file mode 100644 index 0000000..129fd13 --- /dev/null +++ b/src/l_timer.c @@ -0,0 +1,119 @@ +/* + * gcsd + * + * gcsd the generic command sequencer daemon can be used to serialize + * commands sent over various paralell communication channels to a + * single command output. It can be seen as a multiplexer for any + * kind of communication between a single resource and various clients + * which want to submit commands to it or query information from it. + * gcsd is written in C and Lua. The goal is to provide an easy to + * understand high level API based on Lua which can be used to + * implement the business logic of the so formed multiplexer daemon. + * + * + * Copyright (C) 2009-2010 Markus Grueneis + * Christian Pointner + * + * This file is part of gcsd. + * + * gcsd 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. + * + * gcsd 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 gcsd. If not, see . + */ + +#include +#include + +#include +#include +#include +#include + +#include "l_timer.h" + +#define LUA_TIMER_UDATA_NAME "struct timeval" + +static int l_timer_new(lua_State *L) +{ + int ms = luaL_optint(L, 1, 0); + struct timeval* tv = (struct timeval*)lua_newuserdata(L, sizeof(struct timeval)); + luaL_newmetatable(L, LUA_TIMER_UDATA_NAME); + lua_setmetatable(L, -2); + tv->tv_sec = ms/1000; + tv->tv_usec = (ms%1000)*1000; + return 1; +} + +static int l_timer_now(lua_State *L) +{ + struct timeval* now = (struct timeval*)lua_newuserdata(L, sizeof(struct timeval)); + int ret = gettimeofday(now, NULL); + if(ret) { + lua_pushnil(L); + lua_pushstring(L, strerror(errno)); // FIXXXXXME: strerror is not threadsafe!!! + return 2; + } + luaL_newmetatable(L, LUA_TIMER_UDATA_NAME); + lua_setmetatable(L, -2); + return 1; +} + +static int l_timer_add(lua_State *L) +{ + struct timeval* a = (struct timeval*)luaL_checkudata(L, 1, LUA_TIMER_UDATA_NAME); + struct timeval* b = (struct timeval*)luaL_checkudata(L, 2, LUA_TIMER_UDATA_NAME); + struct timeval* res = (struct timeval*)lua_newuserdata(L, sizeof(struct timeval)); + luaL_newmetatable(L, LUA_TIMER_UDATA_NAME); + lua_setmetatable(L, -2); + timeradd(a, b, res); + return 1; +} + +static int l_timer_sub(lua_State *L) +{ + struct timeval* a = (struct timeval*)luaL_checkudata(L, 1, LUA_TIMER_UDATA_NAME); + struct timeval* b = (struct timeval*)luaL_checkudata(L, 2, LUA_TIMER_UDATA_NAME); + struct timeval* res = (struct timeval*)lua_newuserdata(L, sizeof(struct timeval)); + luaL_newmetatable(L, LUA_TIMER_UDATA_NAME); + lua_setmetatable(L, -2); + timersub(a, b, res); + return 1; +} + +static int l_timer_cmp(lua_State *L) +{ + struct timeval* a = (struct timeval*)luaL_checkudata(L, 1, LUA_TIMER_UDATA_NAME); + struct timeval* b = (struct timeval*)luaL_checkudata(L, 2, LUA_TIMER_UDATA_NAME); + if(timercmp(a, b, <)) + lua_pushinteger(L, -1); + else if(timercmp(a, b, >)) + lua_pushinteger(L, 1); + else + lua_pushinteger(L, 0); + + return 1; +} + +static const struct luaL_reg timer_funcs [] = { + { "new", l_timer_new }, + { "now", l_timer_now }, + { "add", l_timer_add }, + { "sub", l_timer_sub }, + { "cmp", l_timer_cmp }, + { NULL, NULL } +}; + +LUALIB_API int luaopen_timer(lua_State *L) +{ + luaL_register(L, LUA_TIMERLIBNAME, timer_funcs); + return 1; +} diff --git a/src/l_timer.h b/src/l_timer.h new file mode 100644 index 0000000..d814920 --- /dev/null +++ b/src/l_timer.h @@ -0,0 +1,41 @@ +/* + * gcsd + * + * gcsd the generic command sequencer daemon can be used to serialize + * commands sent over various paralell communication channels to a + * single command output. It can be seen as a multiplexer for any + * kind of communication between a single resource and various clients + * which want to submit commands to it or query information from it. + * gcsd is written in C and Lua. The goal is to provide an easy to + * understand high level API based on Lua which can be used to + * implement the business logic of the so formed multiplexer daemon. + * + * + * Copyright (C) 2009-2010 Markus Grueneis + * Christian Pointner + * + * This file is part of gcsd. + * + * gcsd 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. + * + * gcsd 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 gcsd. If not, see . + */ + +#ifndef GCSD_l_timer_h_INCLUDED +#define GCSD_l_timer_h_INCLUDED + +#include + +#define LUA_TIMERLIBNAME "timer" +LUALIB_API int luaopen_timer(lua_State *L); + +#endif diff --git a/src/main_loop.lua b/src/main_loop.lua index ee85c4e..f7fe740 100644 --- a/src/main_loop.lua +++ b/src/main_loop.lua @@ -143,6 +143,7 @@ function main_loop(opt) module_list.output:start_command(command) end end + command_queue:check_timeout() end if(return_value == 2) then return_value = 0 end -- cgit v1.2.3