X-Git-Url: http://git.archive.openwrt.org/?p=project%2Flibubox.git;a=blobdiff_plain;f=lua%2Fuloop.c;h=df57b8a9d2ae0471c7bcdbe2eb68964b2d2ae2ef;hp=c71d537a5a904f83028caad2818cbeb0cbbcfe4b;hb=02ca59334743aff65a24cba16c9343412c2c0550;hpb=79b56268b46ea2eaf7f79af7a64c57e2be37636a diff --git a/lua/uloop.c b/lua/uloop.c index c71d537..df57b8a 100644 --- a/lua/uloop.c +++ b/lua/uloop.c @@ -172,6 +172,24 @@ static int get_sock_fd(lua_State* L, int idx) { return fd; } +static int ul_ufd_delete(lua_State *L) +{ + struct lua_uloop_fd *ufd = lua_touserdata(L, 1); + + uloop_fd_delete(&ufd->fd); + lua_getglobal(state, "__uloop_cb"); + luaL_unref(L, -1, ufd->r); + lua_getglobal(state, "__uloop_fds"); + luaL_unref(L, -1, ufd->fd_r); + + return 1; +} + +static const luaL_Reg ufd_m[] = { + { "delete", ul_ufd_delete }, + { NULL, NULL } +}; + static int ul_ufd_add(lua_State *L) { struct lua_uloop_fd *ufd; @@ -205,6 +223,18 @@ static int ul_ufd_add(lua_State *L) lua_pop(L, 1); ufd = lua_newuserdata(L, sizeof(*ufd)); + + lua_createtable(L, 0, 2); + lua_pushvalue(L, -1); + lua_setfield(L, -2, "__index"); + lua_pushcfunction(L, ul_ufd_delete); + lua_setfield(L, -2, "__gc"); + lua_pushvalue(L, -1); + lua_setmetatable(L, -3); + lua_pushvalue(L, -2); + luaI_openlib(L, NULL, ufd_m, 1); + lua_pushvalue(L, -2); + memset(ufd, 0, sizeof(*ufd)); ufd->r = ref;