Updated bindings to use newest features of LuaNativeObjects.

pull/10/head
Robert G. Jakabosky 15 years ago
parent bd375e76c5
commit ed462fe9b8

@ -19,6 +19,7 @@
-- THE SOFTWARE. -- THE SOFTWARE.
object "ZMQ_Ctx" { object "ZMQ_Ctx" {
error_on_null = "get_zmq_strerror()",
c_source [[ c_source [[
typedef void * ZMQ_Ctx; typedef void * ZMQ_Ctx;
]], ]],
@ -30,7 +31,7 @@ typedef void * ZMQ_Ctx;
]] ]]
}, },
method "term" { method "term" {
c_call "ZMQ_Error" "zmq_term" {} c_method_call "ZMQ_Error" "zmq_term" {}
}, },
method "lightuserdata" { method "lightuserdata" {
var_out{ "void *", "ptr" }, var_out{ "void *", "ptr" },
@ -39,13 +40,7 @@ typedef void * ZMQ_Ctx;
]] ]]
}, },
method "socket" { method "socket" {
var_in{ "int", "type" }, c_method_call "!ZMQ_Socket" "zmq_socket" { "int", "type"}
var_out{ "ZMQ_Socket", "sock", own = true },
var_out{ "ZMQ_Error", "err"},
c_source[[
${sock} = zmq_socket(${this}, ${type});
if(${sock} == NULL) ${err} = -1;
]]
}, },
} }

@ -24,18 +24,7 @@ error_code "ZMQ_Error" "int" {
default = "0", default = "0",
c_source [[ c_source [[
if(err != 0) { if(err != 0) {
err = zmq_errno(); err_str = get_zmq_strerror();
switch(err) {
case EAGAIN:
err_str = "timeout";
break;
case ETERM:
err_str = "closed";
break;
default:
err_str = zmq_strerror(err);
break;
}
} }
]], ]],
} }

@ -999,6 +999,22 @@ static const int opt_types[] = {
#define OBJ_UDATA_CTX_SHOULD_FREE (OBJ_UDATA_LAST_FLAG << 1) #define OBJ_UDATA_CTX_SHOULD_FREE (OBJ_UDATA_LAST_FLAG << 1)
static const char *get_zmq_strerror() {
int err = zmq_errno();
switch(err) {
case EAGAIN:
return "timeout";
break;
case ETERM:
return "closed";
break;
default:
break;
}
return zmq_strerror(err);
}
/* method: version */ /* method: version */
@ -1020,52 +1036,46 @@ static int zmq__version__func(lua_State *L) {
/* method: init */ /* method: init */
static int zmq__init__func(lua_State *L) { static int zmq__init__func(lua_State *L) {
int is_error = 0; int ctx_flags = OBJ_UDATA_FLAG_OWN;
int ctx_idx1_flags = OBJ_UDATA_FLAG_OWN; ZMQ_Ctx ctx;
ZMQ_Ctx ctx_idx1;
ZMQ_Error err_idx2 = 0;
if(lua_isnumber(L, 1)) { if(lua_isnumber(L, 1)) {
ctx_idx1 = zmq_init(lua_tointeger(L,1)); ctx = zmq_init(lua_tointeger(L,1));
if(ctx_idx1 == NULL) err_idx2 = -1; ctx_flags |= OBJ_UDATA_CTX_SHOULD_FREE;
ctx_idx1_flags |= OBJ_UDATA_CTX_SHOULD_FREE;
} else if(lua_isuserdata(L, 1)) { } else if(lua_isuserdata(L, 1)) {
ctx_idx1 = lua_touserdata(L, 1); ctx = lua_touserdata(L, 1);
} else { } else {
/* check if value is a LuaJIT 'cdata' */ /* check if value is a LuaJIT 'cdata' */
int type = lua_type(L, 1); int type = lua_type(L, 1);
const char *typename = lua_typename(L, type); const char *typename = lua_typename(L, type);
if(strncmp(typename, "cdata", sizeof("cdata")) == 0) { if(strncmp(typename, "cdata", sizeof("cdata")) == 0) {
ctx_idx1 = (void *)lua_topointer(L, 1); ctx = (void *)lua_topointer(L, 1);
} else { } else {
return luaL_argerror(L, 1, "(expected number)"); return luaL_argerror(L, 1, "(expected number)");
} }
} }
is_error = (0 != err_idx2); if((NULL == ctx)) {
if(is_error) {
lua_pushnil(L); lua_pushnil(L);
lua_pushstring(L, get_zmq_strerror());
} else { } else {
obj_type_ZMQ_Ctx_push(L, ctx_idx1, ctx_idx1_flags); obj_type_ZMQ_Ctx_push(L, ctx, ctx_flags);
} }
error_code__ZMQ_Error__push(L, err_idx2); return 1;
return 2;
} }
/* method: device */ /* method: device */
static int zmq__device__func(lua_State *L) { static int zmq__device__func(lua_State *L) {
int is_error = 0; int device = luaL_checkinteger(L,1);
ZMQ_Error ret_idx1 = 0; ZMQ_Socket insock = obj_type_ZMQ_Socket_check(L,2);
int device_idx1 = luaL_checkinteger(L,1); ZMQ_Socket outsock = obj_type_ZMQ_Socket_check(L,3);
ZMQ_Socket insock_idx2 = obj_type_ZMQ_Socket_check(L,2); ZMQ_Error rc_zmq_device = 0;
ZMQ_Socket outsock_idx3 = obj_type_ZMQ_Socket_check(L,3); rc_zmq_device = zmq_device(device, insock, outsock);
ret_idx1 = zmq_device(device_idx1, insock_idx2, outsock_idx3); /* check for error. */
is_error = (0 != ret_idx1); if((0 != rc_zmq_device)) {
if(is_error) { lua_pushboolean(L, 0);
lua_pushnil(L); error_code__ZMQ_Error__push(L, rc_zmq_device);
error_code__ZMQ_Error__push(L, ret_idx1);
} else { } else {
lua_pushboolean(L, 1); lua_pushboolean(L, 1);
lua_pushnil(L);
} }
return 2; return 2;
} }
@ -1073,18 +1083,7 @@ static int zmq__device__func(lua_State *L) {
static void error_code__ZMQ_Error__push(lua_State *L, ZMQ_Error err) { static void error_code__ZMQ_Error__push(lua_State *L, ZMQ_Error err) {
const char *err_str = NULL; const char *err_str = NULL;
if(err != 0) { if(err != 0) {
err = zmq_errno(); err_str = get_zmq_strerror();
switch(err) {
case EAGAIN:
err_str = "timeout";
break;
case ETERM:
err_str = "closed";
break;
default:
err_str = zmq_strerror(err);
break;
}
} }
if(err_str) { if(err_str) {
@ -1096,11 +1095,11 @@ static void error_code__ZMQ_Error__push(lua_State *L, ZMQ_Error err) {
/* method: delete */ /* method: delete */
static int ZMQ_Ctx__delete__meth(lua_State *L) { static int ZMQ_Ctx__delete__meth(lua_State *L) {
int this_idx1_flags = 0; int this_flags = 0;
ZMQ_Ctx * this_idx1 = obj_type_ZMQ_Ctx_delete(L,1,&(this_idx1_flags)); ZMQ_Ctx * this = obj_type_ZMQ_Ctx_delete(L,1,&(this_flags));
if(!(this_idx1_flags & OBJ_UDATA_FLAG_OWN)) { return 0; } if(!(this_flags & OBJ_UDATA_FLAG_OWN)) { return 0; }
if(this_idx1_flags & OBJ_UDATA_CTX_SHOULD_FREE) { if(this_flags & OBJ_UDATA_CTX_SHOULD_FREE) {
zmq_term(this_idx1); zmq_term(this);
} }
return 0; return 0;
@ -1108,115 +1107,101 @@ static int ZMQ_Ctx__delete__meth(lua_State *L) {
/* method: term */ /* method: term */
static int ZMQ_Ctx__term__meth(lua_State *L) { static int ZMQ_Ctx__term__meth(lua_State *L) {
int is_error = 0; ZMQ_Ctx * this = obj_type_ZMQ_Ctx_check(L,1);
ZMQ_Ctx * this_idx1 = obj_type_ZMQ_Ctx_check(L,1); ZMQ_Error rc_zmq_term = 0;
ZMQ_Error ret_idx1 = 0; rc_zmq_term = zmq_term(this);
ret_idx1 = zmq_term(this_idx1); /* check for error. */
is_error = (0 != ret_idx1); if((0 != rc_zmq_term)) {
if(is_error) { lua_pushboolean(L, 0);
lua_pushnil(L); error_code__ZMQ_Error__push(L, rc_zmq_term);
error_code__ZMQ_Error__push(L, ret_idx1);
} else { } else {
lua_pushboolean(L, 1); lua_pushboolean(L, 1);
lua_pushnil(L);
} }
return 2; return 2;
} }
/* method: lightuserdata */ /* method: lightuserdata */
static int ZMQ_Ctx__lightuserdata__meth(lua_State *L) { static int ZMQ_Ctx__lightuserdata__meth(lua_State *L) {
ZMQ_Ctx * this_idx1 = obj_type_ZMQ_Ctx_check(L,1); ZMQ_Ctx * this = obj_type_ZMQ_Ctx_check(L,1);
void * ptr_idx1 = NULL; void * ptr = NULL;
ptr_idx1 = this_idx1; ptr = this;
lua_pushlightuserdata(L, ptr_idx1); lua_pushlightuserdata(L, ptr);
return 1; return 1;
} }
/* method: socket */ /* method: socket */
static int ZMQ_Ctx__socket__meth(lua_State *L) { static int ZMQ_Ctx__socket__meth(lua_State *L) {
int is_error = 0; ZMQ_Ctx * this = obj_type_ZMQ_Ctx_check(L,1);
ZMQ_Ctx * this_idx1 = obj_type_ZMQ_Ctx_check(L,1); int type = luaL_checkinteger(L,2);
int type_idx2 = luaL_checkinteger(L,2); int rc_zmq_socket_flags = OBJ_UDATA_FLAG_OWN;
int sock_idx1_flags = OBJ_UDATA_FLAG_OWN; ZMQ_Socket rc_zmq_socket;
ZMQ_Socket sock_idx1; rc_zmq_socket = zmq_socket(this, type);
ZMQ_Error err_idx2 = 0; if((NULL == rc_zmq_socket)) {
sock_idx1 = zmq_socket(this_idx1, type_idx2);
if(sock_idx1 == NULL) err_idx2 = -1;
is_error = (0 != err_idx2);
if(is_error) {
lua_pushnil(L); lua_pushnil(L);
lua_pushstring(L, get_zmq_strerror());
} else { } else {
obj_type_ZMQ_Socket_push(L, sock_idx1, sock_idx1_flags); obj_type_ZMQ_Socket_push(L, rc_zmq_socket, rc_zmq_socket_flags);
} }
error_code__ZMQ_Error__push(L, err_idx2); return 1;
return 2;
} }
/* method: close */ /* method: close */
static int ZMQ_Socket__close__meth(lua_State *L) { static int ZMQ_Socket__close__meth(lua_State *L) {
int is_error = 0; int this_flags = 0;
int this_idx1_flags = 0; ZMQ_Socket * this = obj_type_ZMQ_Socket_delete(L,1,&(this_flags));
ZMQ_Socket * this_idx1 = obj_type_ZMQ_Socket_delete(L,1,&(this_idx1_flags)); if(!(this_flags & OBJ_UDATA_FLAG_OWN)) { return 0; }
if(!(this_idx1_flags & OBJ_UDATA_FLAG_OWN)) { return 0; } ZMQ_Error rc_zmq_close = 0;
ZMQ_Error ret_idx1 = 0; rc_zmq_close = zmq_close(this);
ret_idx1 = zmq_close(this_idx1); /* check for error. */
is_error = (0 != ret_idx1); if((0 != rc_zmq_close)) {
if(is_error) { lua_pushboolean(L, 0);
lua_pushnil(L); error_code__ZMQ_Error__push(L, rc_zmq_close);
error_code__ZMQ_Error__push(L, ret_idx1);
} else { } else {
lua_pushboolean(L, 1); lua_pushboolean(L, 1);
lua_pushnil(L);
} }
return 2; return 2;
} }
/* method: bind */ /* method: bind */
static int ZMQ_Socket__bind__meth(lua_State *L) { static int ZMQ_Socket__bind__meth(lua_State *L) {
int is_error = 0; ZMQ_Socket * this = obj_type_ZMQ_Socket_check(L,1);
ZMQ_Socket * this_idx1 = obj_type_ZMQ_Socket_check(L,1); size_t addr_len;
ZMQ_Error ret_idx1 = 0; const char * addr = luaL_checklstring(L,2,&(addr_len));
size_t addr_idx2_len; ZMQ_Error rc_zmq_bind = 0;
const char * addr_idx2 = luaL_checklstring(L,2,&(addr_idx2_len)); rc_zmq_bind = zmq_bind(this, addr);
ret_idx1 = zmq_bind(this_idx1, addr_idx2); /* check for error. */
is_error = (0 != ret_idx1); if((0 != rc_zmq_bind)) {
if(is_error) { lua_pushboolean(L, 0);
lua_pushnil(L); error_code__ZMQ_Error__push(L, rc_zmq_bind);
error_code__ZMQ_Error__push(L, ret_idx1);
} else { } else {
lua_pushboolean(L, 1); lua_pushboolean(L, 1);
lua_pushnil(L);
} }
return 2; return 2;
} }
/* method: connect */ /* method: connect */
static int ZMQ_Socket__connect__meth(lua_State *L) { static int ZMQ_Socket__connect__meth(lua_State *L) {
int is_error = 0; ZMQ_Socket * this = obj_type_ZMQ_Socket_check(L,1);
ZMQ_Socket * this_idx1 = obj_type_ZMQ_Socket_check(L,1); size_t addr_len;
ZMQ_Error ret_idx1 = 0; const char * addr = luaL_checklstring(L,2,&(addr_len));
size_t addr_idx2_len; ZMQ_Error rc_zmq_connect = 0;
const char * addr_idx2 = luaL_checklstring(L,2,&(addr_idx2_len)); rc_zmq_connect = zmq_connect(this, addr);
ret_idx1 = zmq_connect(this_idx1, addr_idx2); /* check for error. */
is_error = (0 != ret_idx1); if((0 != rc_zmq_connect)) {
if(is_error) { lua_pushboolean(L, 0);
lua_pushnil(L); error_code__ZMQ_Error__push(L, rc_zmq_connect);
error_code__ZMQ_Error__push(L, ret_idx1);
} else { } else {
lua_pushboolean(L, 1); lua_pushboolean(L, 1);
lua_pushnil(L);
} }
return 2; return 2;
} }
/* method: setopt */ /* method: setopt */
static int ZMQ_Socket__setopt__meth(lua_State *L) { static int ZMQ_Socket__setopt__meth(lua_State *L) {
int is_error = 0; ZMQ_Socket * this = obj_type_ZMQ_Socket_check(L,1);
ZMQ_Socket * this_idx1 = obj_type_ZMQ_Socket_check(L,1); uint32_t opt = luaL_checkinteger(L,2);
uint32_t opt_idx2 = luaL_checkinteger(L,2); ZMQ_Error err = 0;
ZMQ_Error err_idx1 = 0;
size_t val_len; size_t val_len;
const void *val; const void *val;
@ -1226,11 +1211,11 @@ static int ZMQ_Socket__setopt__meth(lua_State *L) {
uint64_t uint64_val; uint64_t uint64_val;
int64_t int64_val; int64_t int64_val;
if(opt_idx2 > MAX_OPTS) { if(opt > MAX_OPTS) {
return luaL_argerror(L, 2, "Invalid socket option."); return luaL_argerror(L, 2, "Invalid socket option.");
} }
switch(opt_types[opt_idx2]) { switch(opt_types[opt]) {
case OPT_TYPE_FD: case OPT_TYPE_FD:
fd_val = luaL_checklong(L, 3); fd_val = luaL_checklong(L, 3);
val = &fd_val; val = &fd_val;
@ -1264,25 +1249,23 @@ static int ZMQ_Socket__setopt__meth(lua_State *L) {
abort(); abort();
break; break;
} }
err_idx1 = zmq_setsockopt(this_idx1, opt_idx2, val, val_len); err = zmq_setsockopt(this, opt, val, val_len);
is_error = (0 != err_idx1); /* check for error. */
if(is_error) { if((0 != err)) {
lua_pushnil(L); lua_pushboolean(L, 0);
error_code__ZMQ_Error__push(L, err_idx1); error_code__ZMQ_Error__push(L, err);
} else { } else {
lua_pushboolean(L, 1); lua_pushboolean(L, 1);
lua_pushnil(L);
} }
return 2; return 2;
} }
/* method: getopt */ /* method: getopt */
static int ZMQ_Socket__getopt__meth(lua_State *L) { static int ZMQ_Socket__getopt__meth(lua_State *L) {
int is_error = 0; ZMQ_Socket * this = obj_type_ZMQ_Socket_check(L,1);
ZMQ_Socket * this_idx1 = obj_type_ZMQ_Socket_check(L,1); uint32_t opt = luaL_checkinteger(L,2);
uint32_t opt_idx2 = luaL_checkinteger(L,2); ZMQ_Error err = 0;
ZMQ_Error err_idx2 = 0;
size_t val_len; size_t val_len;
socket_t fd_val; socket_t fd_val;
@ -1293,57 +1276,57 @@ static int ZMQ_Socket__getopt__meth(lua_State *L) {
#define STR_MAX 255 #define STR_MAX 255
char str_val[STR_MAX]; char str_val[STR_MAX];
if(opt_idx2 > MAX_OPTS) { if(opt > MAX_OPTS) {
lua_pushnil(L); lua_pushnil(L);
lua_pushliteral(L, "Invalid socket option."); lua_pushliteral(L, "Invalid socket option.");
return 2; return 2;
} }
switch(opt_types[opt_idx2]) { switch(opt_types[opt]) {
case OPT_TYPE_FD: case OPT_TYPE_FD:
val_len = sizeof(fd_val); val_len = sizeof(fd_val);
err_idx2 = zmq_getsockopt(this_idx1, opt_idx2, &fd_val, &val_len); err = zmq_getsockopt(this, opt, &fd_val, &val_len);
if(0 == err_idx2) { if(0 == err) {
lua_pushinteger(L, (lua_Integer)fd_val); lua_pushinteger(L, (lua_Integer)fd_val);
return 1; return 1;
} }
break; break;
case OPT_TYPE_INT: case OPT_TYPE_INT:
val_len = sizeof(int_val); val_len = sizeof(int_val);
err_idx2 = zmq_getsockopt(this_idx1, opt_idx2, &int_val, &val_len); err = zmq_getsockopt(this, opt, &int_val, &val_len);
if(0 == err_idx2) { if(0 == err) {
lua_pushinteger(L, (lua_Integer)int_val); lua_pushinteger(L, (lua_Integer)int_val);
return 1; return 1;
} }
break; break;
case OPT_TYPE_UINT32: case OPT_TYPE_UINT32:
val_len = sizeof(uint32_val); val_len = sizeof(uint32_val);
err_idx2 = zmq_getsockopt(this_idx1, opt_idx2, &uint32_val, &val_len); err = zmq_getsockopt(this, opt, &uint32_val, &val_len);
if(0 == err_idx2) { if(0 == err) {
lua_pushinteger(L, (lua_Integer)uint32_val); lua_pushinteger(L, (lua_Integer)uint32_val);
return 1; return 1;
} }
break; break;
case OPT_TYPE_UINT64: case OPT_TYPE_UINT64:
val_len = sizeof(uint64_val); val_len = sizeof(uint64_val);
err_idx2 = zmq_getsockopt(this_idx1, opt_idx2, &uint64_val, &val_len); err = zmq_getsockopt(this, opt, &uint64_val, &val_len);
if(0 == err_idx2) { if(0 == err) {
lua_pushinteger(L, (lua_Integer)uint64_val); lua_pushinteger(L, (lua_Integer)uint64_val);
return 1; return 1;
} }
break; break;
case OPT_TYPE_INT64: case OPT_TYPE_INT64:
val_len = sizeof(int64_val); val_len = sizeof(int64_val);
err_idx2 = zmq_getsockopt(this_idx1, opt_idx2, &int64_val, &val_len); err = zmq_getsockopt(this, opt, &int64_val, &val_len);
if(0 == err_idx2) { if(0 == err) {
lua_pushinteger(L, (lua_Integer)int64_val); lua_pushinteger(L, (lua_Integer)int64_val);
return 1; return 1;
} }
break; break;
case OPT_TYPE_STR: case OPT_TYPE_STR:
val_len = STR_MAX; val_len = STR_MAX;
err_idx2 = zmq_getsockopt(this_idx1, opt_idx2, str_val, &val_len); err = zmq_getsockopt(this, opt, str_val, &val_len);
if(0 == err_idx2) { if(0 == err) {
lua_pushlstring(L, str_val, val_len); lua_pushlstring(L, str_val, val_len);
return 1; return 1;
} }
@ -1356,69 +1339,81 @@ static int ZMQ_Socket__getopt__meth(lua_State *L) {
} }
lua_pushnil(L); lua_pushnil(L);
is_error = (0 != err_idx2); error_code__ZMQ_Error__push(L, err);
error_code__ZMQ_Error__push(L, err_idx2); return 2;
}
/* method: events */
static int ZMQ_Socket__events__meth(lua_State *L) {
ZMQ_Socket * this = obj_type_ZMQ_Socket_check(L,1);
uint32_t events = 0;
ZMQ_Error err = 0;
size_t val_len = sizeof(events);
err = zmq_getsockopt(this, ZMQ_EVENTS, &(events), &val_len);
if(!(0 != err)) {
lua_pushinteger(L, events);
} else {
lua_pushnil(L);
}
error_code__ZMQ_Error__push(L, err);
return 2; return 2;
} }
/* method: send */ /* method: send */
static int ZMQ_Socket__send__meth(lua_State *L) { static int ZMQ_Socket__send__meth(lua_State *L) {
int is_error = 0; ZMQ_Socket * this = obj_type_ZMQ_Socket_check(L,1);
ZMQ_Socket * this_idx1 = obj_type_ZMQ_Socket_check(L,1); size_t data_len;
size_t data_idx2_len; const char * data = luaL_checklstring(L,2,&(data_len));
const char * data_idx2 = luaL_checklstring(L,2,&(data_idx2_len)); int flags = luaL_optinteger(L,3,0);
int flags_idx3 = luaL_optinteger(L,3,0); ZMQ_Error err = 0;
ZMQ_Error err_idx1 = 0;
zmq_msg_t msg; zmq_msg_t msg;
/* initialize message */ /* initialize message */
err_idx1 = zmq_msg_init_size(&msg, data_idx2_len); err = zmq_msg_init_size(&msg, data_len);
if(0 == err_idx1) { if(0 == err) {
/* fill message */ /* fill message */
memcpy(zmq_msg_data(&msg), data_idx2, data_idx2_len); memcpy(zmq_msg_data(&msg), data, data_len);
/* send message */ /* send message */
err_idx1 = zmq_send(this_idx1, &msg, flags_idx3); err = zmq_send(this, &msg, flags);
/* close message */ /* close message */
zmq_msg_close(&msg); zmq_msg_close(&msg);
} }
is_error = (0 != err_idx1); /* check for error. */
if(is_error) { if((0 != err)) {
lua_pushnil(L); lua_pushboolean(L, 0);
error_code__ZMQ_Error__push(L, err_idx1); error_code__ZMQ_Error__push(L, err);
} else { } else {
lua_pushboolean(L, 1); lua_pushboolean(L, 1);
lua_pushnil(L);
} }
return 2; return 2;
} }
/* method: recv */ /* method: recv */
static int ZMQ_Socket__recv__meth(lua_State *L) { static int ZMQ_Socket__recv__meth(lua_State *L) {
int is_error = 0; ZMQ_Socket * this = obj_type_ZMQ_Socket_check(L,1);
ZMQ_Socket * this_idx1 = obj_type_ZMQ_Socket_check(L,1); int flags = luaL_optinteger(L,2,0);
int flags_idx2 = luaL_optinteger(L,2,0); size_t data_len = 0;
size_t data_idx1_len = 0; const char * data = NULL;
const char * data_idx1 = NULL; ZMQ_Error err = 0;
ZMQ_Error err_idx2 = 0;
zmq_msg_t msg; zmq_msg_t msg;
/* initialize message */ /* initialize message */
err_idx2 = zmq_msg_init(&msg); err = zmq_msg_init(&msg);
if(0 == err_idx2) { if(0 == err) {
/* receive message */ /* receive message */
err_idx2 = zmq_recv(this_idx1, &msg, flags_idx2); err = zmq_recv(this, &msg, flags);
if(0 == err_idx2) { if(0 == err) {
data_idx1 = zmq_msg_data(&msg); data = zmq_msg_data(&msg);
data_idx1_len = zmq_msg_size(&msg); data_len = zmq_msg_size(&msg);
} }
} }
is_error = (0 != err_idx2); if(!(0 != err)) {
if(is_error) { if(data == NULL) lua_pushnil(L); else lua_pushlstring(L, data,data_len);
lua_pushnil(L);
} else { } else {
if(data_idx1 == NULL) lua_pushnil(L); else lua_pushlstring(L, data_idx1,data_idx1_len); lua_pushnil(L);
} }
error_code__ZMQ_Error__push(L, err_idx2); error_code__ZMQ_Error__push(L, err);
/* close message */ /* close message */
zmq_msg_close(&msg); zmq_msg_close(&msg);
@ -1467,6 +1462,7 @@ static const luaL_reg obj_ZMQ_Socket_methods[] = {
{"connect", ZMQ_Socket__connect__meth}, {"connect", ZMQ_Socket__connect__meth},
{"setopt", ZMQ_Socket__setopt__meth}, {"setopt", ZMQ_Socket__setopt__meth},
{"getopt", ZMQ_Socket__getopt__meth}, {"getopt", ZMQ_Socket__getopt__meth},
{"events", ZMQ_Socket__events__meth},
{"send", ZMQ_Socket__send__meth}, {"send", ZMQ_Socket__send__meth},
{"recv", ZMQ_Socket__recv__meth}, {"recv", ZMQ_Socket__recv__meth},
{NULL, NULL} {NULL, NULL}
@ -1502,10 +1498,10 @@ static const obj_const zmq_constants[] = {
{"TYPE", NULL, 16, CONST_NUMBER}, {"TYPE", NULL, 16, CONST_NUMBER},
{"RCVMORE", NULL, 13, CONST_NUMBER}, {"RCVMORE", NULL, 13, CONST_NUMBER},
{"LINGER", NULL, 17, CONST_NUMBER}, {"LINGER", NULL, 17, CONST_NUMBER},
{"REP", NULL, 4, CONST_NUMBER}, {"SWAP", NULL, 3, CONST_NUMBER},
{"MSG_SHARED", NULL, 128, CONST_NUMBER}, {"MSG_SHARED", NULL, 128, CONST_NUMBER},
{"SNDBUF", NULL, 11, CONST_NUMBER}, {"SNDBUF", NULL, 11, CONST_NUMBER},
{"MAX_VSM_SIZE", NULL, 30, CONST_NUMBER}, {"STREAMER", NULL, 1, CONST_NUMBER},
{"NOBLOCK", NULL, 1, CONST_NUMBER}, {"NOBLOCK", NULL, 1, CONST_NUMBER},
{"RCVBUF", NULL, 12, CONST_NUMBER}, {"RCVBUF", NULL, 12, CONST_NUMBER},
{"FORWARDER", NULL, 2, CONST_NUMBER}, {"FORWARDER", NULL, 2, CONST_NUMBER},
@ -1515,30 +1511,30 @@ static const obj_const zmq_constants[] = {
{"FD", NULL, 14, CONST_NUMBER}, {"FD", NULL, 14, CONST_NUMBER},
{"PUB", NULL, 1, CONST_NUMBER}, {"PUB", NULL, 1, CONST_NUMBER},
{"DELIMITER", NULL, 31, CONST_NUMBER}, {"DELIMITER", NULL, 31, CONST_NUMBER},
{"EVENTS", NULL, 15, CONST_NUMBER}, {"BACKLOG", NULL, 19, CONST_NUMBER},
{"SNDMORE", NULL, 2, CONST_NUMBER}, {"SNDMORE", NULL, 2, CONST_NUMBER},
{"AFFINITY", NULL, 4, CONST_NUMBER}, {"POLLIN", NULL, 1, CONST_NUMBER},
{"QUEUE", NULL, 3, CONST_NUMBER}, {"REP", NULL, 4, CONST_NUMBER},
{"POLLERR", NULL, 4, CONST_NUMBER}, {"POLLERR", NULL, 4, CONST_NUMBER},
{"STREAMER", NULL, 1, CONST_NUMBER}, {"MAX_VSM_SIZE", NULL, 30, CONST_NUMBER},
{"RECOVERY_IVL", NULL, 9, CONST_NUMBER}, {"PUSH", NULL, 8, CONST_NUMBER},
{"HWM", NULL, 1, CONST_NUMBER}, {"HWM", NULL, 1, CONST_NUMBER},
{"POLLIN", NULL, 1, CONST_NUMBER}, {"MSG_MORE", NULL, 1, CONST_NUMBER},
{"REQ", NULL, 3, CONST_NUMBER}, {"REQ", NULL, 3, CONST_NUMBER},
{"BACKLOG", NULL, 19, CONST_NUMBER}, {"UNSUBSCRIBE", NULL, 7, CONST_NUMBER},
{"XREQ", NULL, 5, CONST_NUMBER}, {"PULL", NULL, 7, CONST_NUMBER},
{"SWAP", NULL, 3, CONST_NUMBER},
{"PUSH", NULL, 8, CONST_NUMBER},
{"PAIR", NULL, 0, CONST_NUMBER}, {"PAIR", NULL, 0, CONST_NUMBER},
{"VSM", NULL, 32, CONST_NUMBER}, {"QUEUE", NULL, 3, CONST_NUMBER},
{"EVENTS", NULL, 15, CONST_NUMBER},
{"XREQ", NULL, 5, CONST_NUMBER},
{"XREP", NULL, 6, CONST_NUMBER}, {"XREP", NULL, 6, CONST_NUMBER},
{"SUBSCRIBE", NULL, 6, CONST_NUMBER}, {"SUBSCRIBE", NULL, 6, CONST_NUMBER},
{"PULL", NULL, 7, CONST_NUMBER},
{"MCAST_LOOP", NULL, 10, CONST_NUMBER}, {"MCAST_LOOP", NULL, 10, CONST_NUMBER},
{"MSG_MORE", NULL, 1, CONST_NUMBER}, {"VSM", NULL, 32, CONST_NUMBER},
{"RECOVERY_IVL", NULL, 9, CONST_NUMBER},
{"RECONNECT_IVL", NULL, 18, CONST_NUMBER}, {"RECONNECT_IVL", NULL, 18, CONST_NUMBER},
{"POLLOUT", NULL, 2, CONST_NUMBER}, {"POLLOUT", NULL, 2, CONST_NUMBER},
{"UNSUBSCRIBE", NULL, 7, CONST_NUMBER}, {"AFFINITY", NULL, 4, CONST_NUMBER},
{NULL, NULL, 0.0 , 0} {NULL, NULL, 0.0 , 0}
}; };

@ -19,6 +19,7 @@
-- THE SOFTWARE. -- THE SOFTWARE.
object "ZMQ_Socket" { object "ZMQ_Socket" {
error_on_null = "get_zmq_strerror()",
c_source [[ c_source [[
/* detect zmq version >= 2.1.0 */ /* detect zmq version >= 2.1.0 */
#define VERSION_2_1 0 #define VERSION_2_1 0
@ -78,13 +79,13 @@ static const int opt_types[] = {
]], ]],
destructor "close" { destructor "close" {
c_call "ZMQ_Error" "zmq_close" {} c_method_call "ZMQ_Error" "zmq_close" {}
}, },
method "bind" { method "bind" {
c_call "ZMQ_Error" "zmq_bind" { "const char *", "addr" } c_method_call "ZMQ_Error" "zmq_bind" { "const char *", "addr" }
}, },
method "connect" { method "connect" {
c_call "ZMQ_Error" "zmq_connect" { "const char *", "addr" } c_method_call "ZMQ_Error" "zmq_connect" { "const char *", "addr" }
}, },
method "setopt" { method "setopt" {
var_in{ "uint32_t", "opt" }, var_in{ "uint32_t", "opt" },
@ -218,11 +219,19 @@ static const int opt_types[] = {
break; break;
} }
lua_pushnil(L); lua_pushnil(L);
]]
},
method "events" {
var_out{ "uint32_t", "events" },
var_out{ "ZMQ_Error", "err" },
c_source[[
size_t val_len = sizeof(${events});
${err} = zmq_getsockopt(${this}, ZMQ_EVENTS, &(${events}), &val_len);
]] ]]
}, },
method "send" { method "send" {
var_in{ "const char *", "data" }, var_in{ "const char *", "data" },
var_in{ "int", "flags", is_optional = true }, var_in{ "int", "flags?" },
var_out{ "ZMQ_Error", "err" }, var_out{ "ZMQ_Error", "err" },
c_source[[ c_source[[
zmq_msg_t msg; zmq_msg_t msg;

@ -1,4 +1,6 @@
set_variable_format "%s"
c_module "zmq" { c_module "zmq" {
-- module settings. -- module settings.
use_globals = false, use_globals = false,
@ -10,65 +12,83 @@ include "zmq.h",
c_source[[ c_source[[
#define OBJ_UDATA_CTX_SHOULD_FREE (OBJ_UDATA_LAST_FLAG << 1) #define OBJ_UDATA_CTX_SHOULD_FREE (OBJ_UDATA_LAST_FLAG << 1)
static const char *get_zmq_strerror() {
int err = zmq_errno();
switch(err) {
case EAGAIN:
return "timeout";
break;
case ETERM:
return "closed";
break;
default:
break;
}
return zmq_strerror(err);
}
]], ]],
-- --
-- Module constants -- Module constants
-- --
const "MAX_VSM_SIZE" { 30 }, constants {
MAX_VSM_SIZE = 30,
-- message types -- message types
const "DELIMITER" { 31 }, DELIMITER = 31,
const "VSM" { 32 }, VSM = 32,
-- message flags -- message flags
const "MSG_MORE" { 1 }, MSG_MORE = 1,
const "MSG_SHARED" { 128 }, MSG_SHARED = 128,
-- socket types -- socket types
const "PAIR" { 0 }, PAIR = 0,
const "PUB" { 1 }, PUB = 1,
const "SUB" { 2 }, SUB = 2,
const "REQ" { 3 }, REQ = 3,
const "REP" { 4 }, REP = 4,
const "XREQ" { 5 }, XREQ = 5,
const "XREP" { 6 }, XREP = 6,
const "PULL" { 7 }, PULL = 7,
const "PUSH" { 8 }, PUSH = 8,
-- socket options -- socket options
const "HWM" { 1 }, HWM = 1,
const "SWAP" { 3 }, SWAP = 3,
const "AFFINITY" { 4 }, AFFINITY = 4,
const "IDENTITY" { 5 }, IDENTITY = 5,
const "SUBSCRIBE" { 6 }, SUBSCRIBE = 6,
const "UNSUBSCRIBE" { 7 }, UNSUBSCRIBE = 7,
const "RATE" { 8 }, RATE = 8,
const "RECOVERY_IVL" { 9 }, RECOVERY_IVL = 9,
const "MCAST_LOOP" { 10 }, MCAST_LOOP = 10,
const "SNDBUF" { 11 }, SNDBUF = 11,
const "RCVBUF" { 12 }, RCVBUF = 12,
const "RCVMORE" { 13 }, RCVMORE = 13,
const "FD" { 14 }, FD = 14,
const "EVENTS" { 15 }, EVENTS = 15,
const "TYPE" { 16 }, TYPE = 16,
const "LINGER" { 17 }, LINGER = 17,
const "RECONNECT_IVL" { 18 }, RECONNECT_IVL = 18,
const "BACKLOG" { 19 }, BACKLOG = 19,
-- send/recv flags -- send/recv flags
const "NOBLOCK" { 1 }, NOBLOCK = 1,
const "SNDMORE" { 2 }, SNDMORE = 2,
-- poll events -- poll events
const "POLLIN" { 1 }, POLLIN = 1,
const "POLLOUT" { 2 }, POLLOUT = 2,
const "POLLERR" { 4 }, POLLERR = 4,
-- devices -- devices
const "STREAMER" { 1 }, STREAMER = 1,
const "FORWARDER" { 2 }, FORWARDER = 2,
const "QUEUE" { 3 }, QUEUE = 3,
},
-- --
-- Module static functions -- Module static functions
@ -91,12 +111,10 @@ c_function "version" {
}, },
c_function "init" { c_function "init" {
var_in{ "<any>", "io_threads" }, var_in{ "<any>", "io_threads" },
var_out{ "ZMQ_Ctx", "ctx", own = true }, var_out{ "ZMQ_Ctx", "!ctx" },
var_out{ "ZMQ_Error", "err"},
c_source[[ c_source[[
if(lua_isnumber(L, ${io_threads::idx})) { if(lua_isnumber(L, ${io_threads::idx})) {
${ctx} = zmq_init(lua_tointeger(L,${io_threads::idx})); ${ctx} = zmq_init(lua_tointeger(L,${io_threads::idx}));
if(${ctx} == NULL) ${err} = -1;
${ctx}_flags |= OBJ_UDATA_CTX_SHOULD_FREE; ${ctx}_flags |= OBJ_UDATA_CTX_SHOULD_FREE;
} else if(lua_isuserdata(L, ${io_threads::idx})) { } else if(lua_isuserdata(L, ${io_threads::idx})) {
${ctx} = lua_touserdata(L, ${io_threads::idx}); ${ctx} = lua_touserdata(L, ${io_threads::idx});
@ -121,7 +139,6 @@ ffi_files {
"src/zmq_ffi.nobj.lua", "src/zmq_ffi.nobj.lua",
}, },
subfiles { subfiles {
"src/zmq_ffi.nobj.lua",
"src/error.nobj.lua", "src/error.nobj.lua",
"src/ctx.nobj.lua", "src/ctx.nobj.lua",
"src/socket.nobj.lua", "src/socket.nobj.lua",

Loading…
Cancel
Save