Add support for zmq_stopwatch_*() and zmq_sleep() functions.

pull/10/head
Robert G. Jakabosky 15 years ago
parent 82a834eca4
commit a49943157c

@ -12,6 +12,7 @@
#include <string.h> #include <string.h>
#include "zmq.h" #include "zmq.h"
#include "zmq_utils.h"
#define REG_PACKAGE_IS_CONSTRUCTOR 0 #define REG_PACKAGE_IS_CONSTRUCTOR 0
@ -175,6 +176,9 @@ static obj_type obj_types[] = {
#define obj_type_id_ZMQ_Ctx 3 #define obj_type_id_ZMQ_Ctx 3
#define obj_type_ZMQ_Ctx (obj_types[obj_type_id_ZMQ_Ctx]) #define obj_type_ZMQ_Ctx (obj_types[obj_type_id_ZMQ_Ctx])
{ NULL, 3, OBJ_TYPE_FLAG_WEAK_REF, "ZMQ_Ctx" }, { NULL, 3, OBJ_TYPE_FLAG_WEAK_REF, "ZMQ_Ctx" },
#define obj_type_id_ZMQ_StopWatch 4
#define obj_type_ZMQ_StopWatch (obj_types[obj_type_id_ZMQ_StopWatch])
{ NULL, 4, OBJ_TYPE_FLAG_WEAK_REF, "ZMQ_StopWatch" },
{NULL, -1, 0, NULL}, {NULL, -1, 0, NULL},
}; };
@ -706,6 +710,13 @@ static int nobj_try_loading_ffi(lua_State *L, const char *ffi_mod_name,
#define obj_type_ZMQ_Ctx_push(L, obj, flags) \ #define obj_type_ZMQ_Ctx_push(L, obj, flags) \
obj_udata_luapush_weak(L, (void *)obj, &(obj_type_ZMQ_Ctx), flags) obj_udata_luapush_weak(L, (void *)obj, &(obj_type_ZMQ_Ctx), flags)
#define obj_type_ZMQ_StopWatch_check(L, _index) \
obj_udata_luacheck(L, _index, &(obj_type_ZMQ_StopWatch))
#define obj_type_ZMQ_StopWatch_delete(L, _index, flags) \
obj_udata_luadelete_weak(L, _index, &(obj_type_ZMQ_StopWatch), flags)
#define obj_type_ZMQ_StopWatch_push(L, obj, flags) \
obj_udata_luapush_weak(L, (void *)obj, &(obj_type_ZMQ_StopWatch), flags)
@ -966,10 +977,20 @@ static const char zmq_ffi_lua_code[] = "local error = error\n"
"\n" "\n"
"ZMQ_Socket zmq_socket(ZMQ_Ctx * this, int type);\n" "ZMQ_Socket zmq_socket(ZMQ_Ctx * this, int type);\n"
"\n" "\n"
"typedef void * ZMQ_StopWatch;\n"
"\n"
"unsigned long zmq_stopwatch_stop (ZMQ_StopWatch watch_);\n"
"\n"
"ZMQ_StopWatch zmq_stopwatch_start();\n"
"\n"
"ZMQ_Ctx zmq_init(int io_threads);\n" "ZMQ_Ctx zmq_init(int io_threads);\n"
"\n" "\n"
"ZMQ_Error zmq_device(int device, ZMQ_Socket insock, ZMQ_Socket outsock);\n" "ZMQ_Error zmq_device(int device, ZMQ_Socket insock, ZMQ_Socket outsock);\n"
"\n" "\n"
"ZMQ_StopWatch zmq_stopwatch_start();\n"
"\n"
"void zmq_sleep(int seconds_);\n"
"\n"
"\n" "\n"
"]]\n" "]]\n"
"\n" "\n"
@ -1101,6 +1122,38 @@ static const char zmq_ffi_lua_code[] = "local error = error\n"
"end)()\n" "end)()\n"
"\n" "\n"
"\n" "\n"
"local obj_type_ZMQ_StopWatch_check\n"
"local obj_type_ZMQ_StopWatch_delete\n"
"local obj_type_ZMQ_StopWatch_push\n"
"\n"
"(function()\n"
"local ZMQ_StopWatch_mt = _priv.ZMQ_StopWatch\n"
"local ZMQ_StopWatch_objects = setmetatable({}, { __mode = \"k\" })\n"
"function obj_type_ZMQ_StopWatch_check(ud_obj)\n"
" local c_obj = ZMQ_StopWatch_objects[ud_obj]\n"
" if c_obj == nil then\n"
" -- cdata object not in cache\n"
" c_obj = obj_udata_luacheck(ud_obj, ZMQ_StopWatch_mt)\n"
" c_obj = ffi.cast(\"ZMQ_StopWatch *\", c_obj) -- cast from 'void *'\n"
" ZMQ_StopWatch_objects[ud_obj] = c_obj\n"
" end\n"
" return c_obj\n"
"end\n"
"\n"
"function obj_type_ZMQ_StopWatch_delete(ud_obj)\n"
" ZMQ_StopWatch_objects[ud_obj] = nil\n"
" return obj_udata_luadelete_weak(ud_obj, ZMQ_StopWatch_mt)\n"
"end\n"
"\n"
"local ZMQ_StopWatch_type = ffi.cast(\"obj_type *\", ZMQ_StopWatch_mt[\".type\"])\n"
"function obj_type_ZMQ_StopWatch_push(c_obj, flags)\n"
" local ud_obj = obj_udata_luapush_weak(c_obj, ZMQ_StopWatch_mt, ZMQ_StopWatch_type, flags)\n"
" ZMQ_StopWatch_objects[ud_obj] = c_obj\n"
" return ud_obj\n"
"end\n"
"end)()\n"
"\n"
"\n"
"local _pub = {}\n" "local _pub = {}\n"
"local _meth = {}\n" "local _meth = {}\n"
"for obj_name,mt in pairs(_priv) do\n" "for obj_name,mt in pairs(_priv) do\n"
@ -1679,6 +1732,32 @@ static const char zmq_ffi_lua_code[] = "local error = error\n"
"\n" "\n"
"-- End \"ZMQ_Ctx\" FFI interface\n" "-- End \"ZMQ_Ctx\" FFI interface\n"
"\n" "\n"
"\n"
"-- Start \"ZMQ_StopWatch\" FFI interface\n"
"-- method: start\n"
"function _pub.ZMQ_StopWatch.start()\n"
" local this_flags = OBJ_UDATA_FLAG_OWN\n"
" local this\n"
" local rc_zmq_stopwatch_start\n"
" rc_zmq_stopwatch_start = C.zmq_stopwatch_start()\n"
" this = obj_type_ZMQ_StopWatch_push(this, this_flags)\n"
" rc_zmq_stopwatch_start = obj_type_ZMQ_StopWatch_push(rc_zmq_stopwatch_start, 0)\n"
" return this, rc_zmq_stopwatch_start\n"
"end\n"
"\n"
"-- method: stop\n"
"function _meth.ZMQ_StopWatch.stop(self)\n"
" local this,this_flags = obj_type_ZMQ_StopWatch_delete(self)\n"
" if(band(this_flags,OBJ_UDATA_FLAG_OWN) == 0) then return end\n"
" local usecs\n"
" usecs = tonumber(C.zmq_stopwatch_stop(this))\n"
"\n"
" usecs = usecs\n"
" return usecs\n"
"end\n"
"\n"
"-- End \"ZMQ_StopWatch\" FFI interface\n"
"\n"
"-- method: init\n" "-- method: init\n"
"function _pub.zmq.init(io_threads)\n" "function _pub.zmq.init(io_threads)\n"
" \n" " \n"
@ -1733,6 +1812,22 @@ static const char zmq_ffi_lua_code[] = "local error = error\n"
" return rc_zmq_device, rc_zmq_device_err\n" " return rc_zmq_device, rc_zmq_device_err\n"
"end\n" "end\n"
"\n" "\n"
"-- method: stopwatch_start\n"
"function _pub.zmq.stopwatch_start()\n"
" local rc_zmq_stopwatch_start_flags = OBJ_UDATA_FLAG_OWN\n"
" local rc_zmq_stopwatch_start\n"
" rc_zmq_stopwatch_start = C.zmq_stopwatch_start()\n"
" rc_zmq_stopwatch_start = obj_type_ZMQ_StopWatch_push(rc_zmq_stopwatch_start, rc_zmq_stopwatch_start_flags)\n"
" return rc_zmq_stopwatch_start\n"
"end\n"
"\n"
"-- method: sleep\n"
"function _pub.zmq.sleep(seconds_)\n"
" \n"
" C.zmq_sleep(seconds_)\n"
" return \n"
"end\n"
"\n"
""; "";
/* detect zmq version >= 2.1.0 */ /* detect zmq version >= 2.1.0 */
@ -1989,6 +2084,8 @@ static int poller_poll(ZMQ_Poller *this, long timeout) {
typedef void * ZMQ_Ctx; typedef void * ZMQ_Ctx;
typedef void * ZMQ_StopWatch;
/* /*
* This wrapper function is to make the EAGAIN/ETERM error messages more like * This wrapper function is to make the EAGAIN/ETERM error messages more like
* what is returned by LuaSocket. * what is returned by LuaSocket.
@ -2797,6 +2894,29 @@ static int ZMQ_Ctx__socket__meth(lua_State *L) {
return 1; return 1;
} }
/* method: start */
static int ZMQ_StopWatch__start__meth(lua_State *L) {
int this_flags = OBJ_UDATA_FLAG_OWN;
ZMQ_StopWatch * this;
ZMQ_StopWatch rc_zmq_stopwatch_start;
rc_zmq_stopwatch_start = zmq_stopwatch_start();
obj_type_ZMQ_StopWatch_push(L, this, this_flags);
obj_type_ZMQ_StopWatch_push(L, rc_zmq_stopwatch_start, 0);
return 2;
}
/* method: stop */
static int ZMQ_StopWatch__stop__meth(lua_State *L) {
int this_flags = 0;
ZMQ_StopWatch * this = obj_type_ZMQ_StopWatch_delete(L,1,&(this_flags));
unsigned long usecs = 0;
if(!(this_flags & OBJ_UDATA_FLAG_OWN)) { return 0; }
usecs = zmq_stopwatch_stop(this);
lua_pushinteger(L, usecs);
return 1;
}
/* method: version */ /* method: version */
static int zmq__version__func(lua_State *L) { static int zmq__version__func(lua_State *L) {
int major, minor, patch; int major, minor, patch;
@ -2865,6 +2985,22 @@ static int zmq__device__func(lua_State *L) {
return 2; return 2;
} }
/* method: stopwatch_start */
static int zmq__stopwatch_start__func(lua_State *L) {
int rc_zmq_stopwatch_start_flags = OBJ_UDATA_FLAG_OWN;
ZMQ_StopWatch rc_zmq_stopwatch_start;
rc_zmq_stopwatch_start = zmq_stopwatch_start();
obj_type_ZMQ_StopWatch_push(L, rc_zmq_stopwatch_start, rc_zmq_stopwatch_start_flags);
return 1;
}
/* method: sleep */
static int zmq__sleep__func(lua_State *L) {
int seconds_ = luaL_checkinteger(L,1);
zmq_sleep(seconds_);
return 0;
}
/* method: dump_ffi */ /* method: dump_ffi */
static int zmq__dump_ffi__func(lua_State *L) { static int zmq__dump_ffi__func(lua_State *L) {
size_t ffi_code_len = 0; size_t ffi_code_len = 0;
@ -3017,11 +3153,42 @@ static const obj_const obj_ZMQ_Ctx_constants[] = {
{NULL, NULL, 0.0 , 0} {NULL, NULL, 0.0 , 0}
}; };
static const luaL_reg obj_ZMQ_StopWatch_pub_funcs[] = {
{"start", ZMQ_StopWatch__start__meth},
{NULL, NULL}
};
static const luaL_reg obj_ZMQ_StopWatch_methods[] = {
{"stop", ZMQ_StopWatch__stop__meth},
{NULL, NULL}
};
static const luaL_reg obj_ZMQ_StopWatch_metas[] = {
{"__gc", ZMQ_StopWatch__stop__meth},
{"__tostring", obj_udata_default_tostring},
{"__eq", obj_udata_default_equal},
{NULL, NULL}
};
static const obj_base obj_ZMQ_StopWatch_bases[] = {
{-1, NULL}
};
static const obj_field obj_ZMQ_StopWatch_fields[] = {
{NULL, 0, 0, 0}
};
static const obj_const obj_ZMQ_StopWatch_constants[] = {
{NULL, NULL, 0.0 , 0}
};
static const luaL_reg zmq_function[] = { static const luaL_reg zmq_function[] = {
{"version", zmq__version__func}, {"version", zmq__version__func},
{"init", zmq__init__func}, {"init", zmq__init__func},
{"init_ctx", zmq__init_ctx__func}, {"init_ctx", zmq__init_ctx__func},
{"device", zmq__device__func}, {"device", zmq__device__func},
{"stopwatch_start", zmq__stopwatch_start__func},
{"sleep", zmq__sleep__func},
{"dump_ffi", zmq__dump_ffi__func}, {"dump_ffi", zmq__dump_ffi__func},
{NULL, NULL} {NULL, NULL}
}; };
@ -3088,6 +3255,7 @@ static const reg_sub_module reg_sub_modules[] = {
{ &(obj_type_ZMQ_Socket), 0, obj_ZMQ_Socket_pub_funcs, obj_ZMQ_Socket_methods, obj_ZMQ_Socket_metas, obj_ZMQ_Socket_bases, obj_ZMQ_Socket_fields, obj_ZMQ_Socket_constants}, { &(obj_type_ZMQ_Socket), 0, obj_ZMQ_Socket_pub_funcs, obj_ZMQ_Socket_methods, obj_ZMQ_Socket_metas, obj_ZMQ_Socket_bases, obj_ZMQ_Socket_fields, obj_ZMQ_Socket_constants},
{ &(obj_type_ZMQ_Poller), 0, obj_ZMQ_Poller_pub_funcs, obj_ZMQ_Poller_methods, obj_ZMQ_Poller_metas, obj_ZMQ_Poller_bases, obj_ZMQ_Poller_fields, obj_ZMQ_Poller_constants}, { &(obj_type_ZMQ_Poller), 0, obj_ZMQ_Poller_pub_funcs, obj_ZMQ_Poller_methods, obj_ZMQ_Poller_metas, obj_ZMQ_Poller_bases, obj_ZMQ_Poller_fields, obj_ZMQ_Poller_constants},
{ &(obj_type_ZMQ_Ctx), 0, obj_ZMQ_Ctx_pub_funcs, obj_ZMQ_Ctx_methods, obj_ZMQ_Ctx_metas, obj_ZMQ_Ctx_bases, obj_ZMQ_Ctx_fields, obj_ZMQ_Ctx_constants}, { &(obj_type_ZMQ_Ctx), 0, obj_ZMQ_Ctx_pub_funcs, obj_ZMQ_Ctx_methods, obj_ZMQ_Ctx_metas, obj_ZMQ_Ctx_bases, obj_ZMQ_Ctx_fields, obj_ZMQ_Ctx_constants},
{ &(obj_type_ZMQ_StopWatch), 0, obj_ZMQ_StopWatch_pub_funcs, obj_ZMQ_StopWatch_methods, obj_ZMQ_StopWatch_metas, obj_ZMQ_StopWatch_bases, obj_ZMQ_StopWatch_fields, obj_ZMQ_StopWatch_constants},
{NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL} {NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL}
}; };

@ -0,0 +1,44 @@
-- Copyright (c) 2011 by Robert G. Jakabosky <bobby@sharedrealm.com>
--
-- Permission is hereby granted, free of charge, to any person obtaining a copy
-- of this software and associated documentation files (the "Software"), to deal
-- in the Software without restriction, including without limitation the rights
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-- copies of the Software, and to permit persons to whom the Software is
-- furnished to do so, subject to the following conditions:
--
-- The above copyright notice and this permission notice shall be included in
-- all copies or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-- THE SOFTWARE.
object "ZMQ_StopWatch" {
include "zmq_utils.h",
ffi_cdef[[
typedef void * ZMQ_StopWatch;
unsigned long zmq_stopwatch_stop (ZMQ_StopWatch watch_);
]],
c_source[[
typedef void * ZMQ_StopWatch;
]],
constructor "start" {
c_call "ZMQ_StopWatch" "zmq_stopwatch_start" {},
},
destructor "stop" {
var_out{ "unsigned long", "usecs" },
c_source[[
${usecs} = zmq_stopwatch_stop(${this});
]],
ffi_source[[
${usecs} = tonumber(C.zmq_stopwatch_stop(${this}))
]],
},
}

@ -136,6 +136,7 @@ subfiles {
"src/socket.nobj.lua", "src/socket.nobj.lua",
"src/poller.nobj.lua", "src/poller.nobj.lua",
"src/ctx.nobj.lua", "src/ctx.nobj.lua",
"src/stopwatch.nobj.lua",
}, },
-- --
@ -186,6 +187,16 @@ c_function "device" {
{ "int", "device", "ZMQ_Socket", "insock", "ZMQ_Socket", "outsock" }, { "int", "device", "ZMQ_Socket", "insock", "ZMQ_Socket", "outsock" },
}, },
--
-- zmq_utils.h
--
include "zmq_utils.h",
c_function "stopwatch_start" {
c_call "!ZMQ_StopWatch" "zmq_stopwatch_start" {},
},
c_function "sleep" {
c_call "void" "zmq_sleep" { "int", "seconds_" },
},
-- --
-- This dump function is for getting a copy of the FFI-based bindings code and is -- This dump function is for getting a copy of the FFI-based bindings code and is
-- only for debugging. -- only for debugging.

Loading…
Cancel
Save