summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2010-12-18 20:52:25 +0000
committerChristian Pointner <equinox@spreadspace.org>2010-12-18 20:52:25 +0000
commitd63bb833df7f1d48184c69e0f3a0199fe809d4e8 (patch)
tree3533086c8cde4b742ef989240659645b4d9fcf71
parentfixed typos at manpage (diff)
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
-rw-r--r--src/Makefile1
-rw-r--r--src/command_queue.lua10
-rw-r--r--src/gcsd.c2
-rw-r--r--src/l_timer.c119
-rw-r--r--src/l_timer.h41
-rw-r--r--src/main_loop.lua1
6 files changed, 173 insertions, 1 deletions
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 <gimpf@spreadspace.org>
+ * Christian Pointner <equinox@spreadspace.org>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include <lua.h>
+#include <lauxlib.h>
+
+#include <sys/time.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+
+#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 <gimpf@spreadspace.org>
+ * Christian Pointner <equinox@spreadspace.org>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GCSD_l_timer_h_INCLUDED
+#define GCSD_l_timer_h_INCLUDED
+
+#include <lua.h>
+
+#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