Merge branch 'master' of https://github.com/dcreager/lua-zmq into dcreager-master

lua-zmq
Aleksey Yeschenko 16 years ago
commit 5578612efe

50
zmq.c

@ -42,7 +42,10 @@
#define MT_ZMQ_CONTEXT "MT_ZMQ_CONTEXT" #define MT_ZMQ_CONTEXT "MT_ZMQ_CONTEXT"
#define MT_ZMQ_SOCKET "MT_ZMQ_SOCKET" #define MT_ZMQ_SOCKET "MT_ZMQ_SOCKET"
typedef struct { void *ptr; } zmq_ptr; typedef struct {
void *ptr;
int should_free;
} zmq_ptr;
static int Lzmq_version(lua_State *L) static int Lzmq_version(lua_State *L)
{ {
@ -88,16 +91,35 @@ static int Lzmq_push_error(lua_State *L)
static int Lzmq_init(lua_State *L) static int Lzmq_init(lua_State *L)
{ {
int io_threads = luaL_checkint(L, 1);
zmq_ptr *ctx = lua_newuserdata(L, sizeof(zmq_ptr)); zmq_ptr *ctx = lua_newuserdata(L, sizeof(zmq_ptr));
luaL_getmetatable(L, MT_ZMQ_CONTEXT);
lua_setmetatable(L, -2);
if (lua_islightuserdata(L, 1)) {
// Treat a light userdata as a raw ZMQ context object, which
// we'll silently wrap. (And we won't automatically call term
// on it.)
ctx->ptr = lua_touserdata(L, 1);
ctx->should_free = 0;
return 1;
}
int io_threads = luaL_checkint(L, 1);
ctx->ptr = zmq_init(io_threads); ctx->ptr = zmq_init(io_threads);
if (!ctx->ptr) { if (!ctx->ptr) {
return Lzmq_push_error(L); return Lzmq_push_error(L);
} }
luaL_getmetatable(L, MT_ZMQ_CONTEXT); // toboolean defaults to false, but we want a missing param #2
lua_setmetatable(L, -2); // to mean true
if (lua_isnil(L, 2)) {
ctx->should_free = 1;
} else {
ctx->should_free = lua_toboolean(L, 2);
}
return 1; return 1;
} }
@ -119,6 +141,23 @@ static int Lzmq_term(lua_State *L)
return 1; return 1;
} }
static int Lzmq_ctx_gc(lua_State *L)
{
zmq_ptr *ctx = luaL_checkudata(L, 1, MT_ZMQ_CONTEXT);
if (ctx->should_free) {
return Lzmq_term(L);
} else {
return 0;
}
}
static int Lzmq_ctx_lightuserdata(lua_State *L)
{
zmq_ptr *ctx = luaL_checkudata(L, 1, MT_ZMQ_CONTEXT);
lua_pushlightuserdata(L, ctx->ptr);
return 1;
}
static int Lzmq_socket(lua_State *L) static int Lzmq_socket(lua_State *L)
{ {
zmq_ptr *ctx = luaL_checkudata(L, 1, MT_ZMQ_CONTEXT); zmq_ptr *ctx = luaL_checkudata(L, 1, MT_ZMQ_CONTEXT);
@ -430,7 +469,8 @@ static const luaL_reg zmqlib[] = {
}; };
static const luaL_reg ctxmethods[] = { static const luaL_reg ctxmethods[] = {
{"__gc", Lzmq_term}, {"__gc", Lzmq_ctx_gc},
{"lightuserdata", Lzmq_ctx_lightuserdata},
{"term", Lzmq_term}, {"term", Lzmq_term},
{"socket", Lzmq_socket}, {"socket", Lzmq_socket},
{NULL, NULL} {NULL, NULL}

Loading…
Cancel
Save