[asterisk-commits] mnicholson: branch mnicholson/asttest r247905 - in /team/mnicholson/asttest/a...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Feb 19 10:54:40 CST 2010
Author: mnicholson
Date: Fri Feb 19 10:54:37 2010
New Revision: 247905
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=247905
Log:
Added the ability to pass a timeout to proc:wait()
Added the proc:term_or_kill() function (and the asterisk:term_or_kill() function). This function will send the term signal, wait 10 seconds, then send the kill signal.
Modified:
team/mnicholson/asttest/asttest/lua/astlib.lua
team/mnicholson/asttest/asttest/lua/proclib.c
team/mnicholson/asttest/asttest/lua/proclib.lua
team/mnicholson/asttest/asttest/self-tests/astlib_load_config/test.lua
team/mnicholson/asttest/asttest/self-tests/astlib_load_config_in_dir/test.lua
team/mnicholson/asttest/asttest/self-tests/astlib_manager/test.lua
team/mnicholson/asttest/asttest/self-tests/spawn_asterisk/test.lua
Modified: team/mnicholson/asttest/asttest/lua/astlib.lua
URL: http://svnview.digium.com/svn/asterisk/team/mnicholson/asttest/asttest/lua/astlib.lua?view=diff&rev=247905&r1=247904&r2=247905
==============================================================================
--- team/mnicholson/asttest/asttest/lua/astlib.lua (original)
+++ team/mnicholson/asttest/asttest/lua/astlib.lua Fri Feb 19 10:54:37 2010
@@ -61,19 +61,24 @@
return self:wait()
end
-function asterisk:wait()
+function asterisk:wait(timeout)
if not proc then return nil, "error" end
- return self.proc:wait()
-end
-
-function asterisk:term()
+ return self.proc:wait(timeout)
+end
+
+function asterisk:term(timeout)
if not proc then return nil, "error" end
- return self.proc:term()
+ return self.proc:term(timeout)
end
function asterisk:kill()
if not proc then return nil, "error" end
return self.proc:kill()
+end
+
+function asterisk:term_or_kill()
+ if not proc then return nil, "error" end
+ return self.proc:term_or_kill()
end
function asterisk:__newindex(conffile_name, conffile)
Modified: team/mnicholson/asttest/asttest/lua/proclib.c
URL: http://svnview.digium.com/svn/asterisk/team/mnicholson/asttest/asttest/lua/proclib.c?view=diff&rev=247905&r1=247904&r2=247905
==============================================================================
--- team/mnicholson/asttest/asttest/lua/proclib.c (original)
+++ team/mnicholson/asttest/asttest/lua/proclib.c Fri Feb 19 10:54:37 2010
@@ -31,6 +31,8 @@
#include <sys/wait.h>
#include <unistd.h>
#include <fcntl.h>
+#include <sys/time.h>
+#include <time.h>
/*!
* \brief [lua_CFunction proc.exec] Start a process.
@@ -134,8 +136,18 @@
}
/*!
+ * \brief Convert a timeval struct to milliseconds.
+ * \param tv the timeval struct to operate on
+ * \return the value of the given timeval expressed in milliseconds
+ */
+static long tv2ms(struct timeval *tv) {
+ return (tv->tv_sec * 1000 + tv->tv_usec / 1000);
+}
+
+/*!
* \brief [lua_CFunction proc:wait] Wait for the process to end.
* \param L the lua state to use
+ * \param timeout an optional timeout in milliseconds
*
* This function calls waitpid on the running process.
*
@@ -146,8 +158,20 @@
static int wait_proc(lua_State *L) {
pid_t pid;
int status;
+ int res;
+ long timeout = luaL_optlong(L, 2, -1);
+ long start;
+ struct timeval tv;
luaL_checktype(L, 1, LUA_TTABLE);
+
+ if (gettimeofday(&tv, NULL)) {
+ lua_pushliteral(L, "error running gettimeofday() for timeout calculations: ");
+ lua_pushstring(L, strerror(errno));
+ lua_concat(L, 2);
+ return lua_error(L);
+ }
+ start = tv2ms(&tv);
/* get the pid of this process */
lua_getfield(L, 1, "pid");
@@ -160,11 +184,37 @@
pid = *(pid_t *) lua_touserdata(L, -1);
lua_pop(L, 1);
- if (waitpid(pid, &status, 0) == -1) {
- /* waitpid failed */
- lua_pushnil(L);
- lua_pushliteral(L, "error");
- return 2;
+ if (timeout >= 0) {
+ while ((res = waitpid(pid, &status, WNOHANG)) == 0) {
+ /* check the timeout */
+ if (gettimeofday(&tv, NULL)) {
+ lua_pushliteral(L, "error running gettimeofday() for timeout calculations: ");
+ lua_pushstring(L, strerror(errno));
+ lua_concat(L, 2);
+ return lua_error(L);
+ }
+
+ if (timeout < tv2ms(&tv) - start) {
+ lua_pushnil(L);
+ lua_pushliteral(L, "timeout");
+ return 2;
+ }
+ usleep(1);
+ }
+
+ if (res == -1) {
+ /* waitpid failed */
+ lua_pushnil(L);
+ lua_pushliteral(L, "error");
+ return 2;
+ }
+ } else {
+ if (waitpid(pid, &status, 0) == -1) {
+ /* waitpid failed */
+ lua_pushnil(L);
+ lua_pushliteral(L, "error");
+ return 2;
+ }
}
if (WIFEXITED(status)) {
@@ -232,6 +282,7 @@
/*!
* \brief [lua_CFunction proc:term] Terminate process with SIGTERM.
* \param L the lua state to use
+ * \param timeout an optional timeout in milliseconds that will be passed to proc:wait()
*
* This function sends SIGTERM then calls proc:wait() and returns the result.
*
@@ -240,6 +291,7 @@
*/
static int terminate_proc(lua_State *L) {
pid_t pid;
+ long timeout = luaL_optlong(L, 2, -1);
luaL_checktype(L, 1, LUA_TTABLE);
@@ -264,7 +316,13 @@
lua_pushcfunction(L, wait_proc);
lua_pushvalue(L, 1);
- lua_call(L, 1, 2);
+ if (timeout == -1) {
+ lua_pushnil(L);
+ } else {
+ lua_pushvalue(L, 2);
+ }
+
+ lua_call(L, 2, 2);
return 2;
}
@@ -288,7 +346,6 @@
int luaopen_proclib(lua_State *L) {
/* register our functions */
luaL_register(L, "proc", proclib);
- lua_pop(L, 1);
/* set up the pid metatable */
luaL_newmetatable(L, "proclib_pid");
@@ -304,6 +361,9 @@
lua_settable(L, -3);
luaL_register(L, NULL, proc_table);
+ /* store this table as 'proc.proc' as well */
+ lua_setfield(L, -2, "proc");
+
lua_pop(L, 1);
/* load the lua portion of the lib */
Modified: team/mnicholson/asttest/asttest/lua/proclib.lua
URL: http://svnview.digium.com/svn/asterisk/team/mnicholson/asttest/asttest/lua/proclib.lua?view=diff&rev=247905&r1=247904&r2=247905
==============================================================================
--- team/mnicholson/asttest/asttest/lua/proclib.lua (original)
+++ team/mnicholson/asttest/asttest/lua/proclib.lua Fri Feb 19 10:54:37 2010
@@ -23,3 +23,13 @@
return p:wait()
end
+-- sent the term signal and give the process 10 seconds to exit then kill it
+function proc:term_or_kill()
+ local res, err = self:term(10000)
+ if not res and err == 'timeout' then
+ return self:kill()
+ end
+
+ return res, err
+end
+
Modified: team/mnicholson/asttest/asttest/self-tests/astlib_load_config/test.lua
URL: http://svnview.digium.com/svn/asterisk/team/mnicholson/asttest/asttest/self-tests/astlib_load_config/test.lua?view=diff&rev=247905&r1=247904&r2=247905
==============================================================================
--- team/mnicholson/asttest/asttest/self-tests/astlib_load_config/test.lua (original)
+++ team/mnicholson/asttest/asttest/self-tests/astlib_load_config/test.lua Fri Feb 19 10:54:37 2010
@@ -19,7 +19,7 @@
a = ast.new()
a:load_config("expected_test.conf")
a:spawn()
-a:term()
+a:term_or_kill()
test_conf_path = a.work_area .. "/etc/asterisk/expected_test.conf"
Modified: team/mnicholson/asttest/asttest/self-tests/astlib_load_config_in_dir/test.lua
URL: http://svnview.digium.com/svn/asterisk/team/mnicholson/asttest/asttest/self-tests/astlib_load_config_in_dir/test.lua?view=diff&rev=247905&r1=247904&r2=247905
==============================================================================
--- team/mnicholson/asttest/asttest/self-tests/astlib_load_config_in_dir/test.lua (original)
+++ team/mnicholson/asttest/asttest/self-tests/astlib_load_config_in_dir/test.lua Fri Feb 19 10:54:37 2010
@@ -19,7 +19,7 @@
a = ast.new()
a:load_config("dir/expected_test.conf")
a:spawn()
-a:term()
+a:term_or_kill()
test_conf_path = a.work_area .. "/etc/asterisk/expected_test.conf"
Modified: team/mnicholson/asttest/asttest/self-tests/astlib_manager/test.lua
URL: http://svnview.digium.com/svn/asterisk/team/mnicholson/asttest/asttest/self-tests/astlib_manager/test.lua?view=diff&rev=247905&r1=247904&r2=247905
==============================================================================
--- team/mnicholson/asttest/asttest/self-tests/astlib_manager/test.lua (original)
+++ team/mnicholson/asttest/asttest/self-tests/astlib_manager/test.lua Fri Feb 19 10:54:37 2010
@@ -29,7 +29,7 @@
r = m(logoff)
-status, err = a:term()
+status, err = a:term_or_kill()
if not status then
fail("error terminating asterisk: " .. err)
end
Modified: team/mnicholson/asttest/asttest/self-tests/spawn_asterisk/test.lua
URL: http://svnview.digium.com/svn/asterisk/team/mnicholson/asttest/asttest/self-tests/spawn_asterisk/test.lua?view=diff&rev=247905&r1=247904&r2=247905
==============================================================================
--- team/mnicholson/asttest/asttest/self-tests/spawn_asterisk/test.lua (original)
+++ team/mnicholson/asttest/asttest/self-tests/spawn_asterisk/test.lua Fri Feb 19 10:54:37 2010
@@ -3,7 +3,7 @@
a = ast.new()
a:spawn()
posix.sleep(1)
-res, err = a:term()
+res, err = a:term_or_kill()
print(res)
print(err)
More information about the asterisk-commits
mailing list