static int lluv_poll_start(lua_State *L){ static const lluv_uv_const_t FLAGS[] = { { UV_READABLE, "readable" }, { UV_WRITABLE, "writable" }, #if LLUV_UV_VER_GE(1,9,0) { UV_DISCONNECT, "disconnect" }, #endif { 0, NULL } }; lluv_handle_t *handle = lluv_check_poll(L, 1, LLUV_FLAG_OPEN); int events = UV_READABLE; int err; if(!lua_isfunction(L, 2)) events = lluv_opt_flags_ui(L, 2, UV_READABLE, FLAGS); lluv_check_args_with_cb(L, 3); LLUV_START_CB(handle) = luaL_ref(L, LLUV_LUA_REGISTRY); err = uv_poll_start(LLUV_H(handle, uv_poll_t), events, lluv_on_poll_start); if(err >= 0) lluv_handle_lock(L, handle, LLUV_LOCK_START); return lluv_return(L, handle, LLUV_START_CB(handle), err); }
static int lluv_udp_start_recv(lua_State *L){ lluv_handle_t *handle = lluv_check_udp(L, 1, LLUV_FLAG_OPEN); int err; lluv_check_args_with_cb(L, 2); LLUV_READ_CB(handle) = luaL_ref(L, LLUV_LUA_REGISTRY); err = uv_udp_recv_start(LLUV_H(handle, uv_udp_t), lluv_alloc_buffer_cb, lluv_on_udp_recv_cb); if(err >= 0) lluv_handle_lock(L, handle, LLUV_LOCK_READ); return lluv_return(L, handle, LLUV_READ_CB(handle), err); }
static int lluv_signal_start(lua_State *L){ lluv_handle_t *handle = lluv_check_signal(L, 1, LLUV_FLAG_OPEN); int signum = luaL_checkint(L, 2); int err; lluv_check_args_with_cb(L, 3); LLUV_START_CB(handle) = luaL_ref(L, LLUV_LUA_REGISTRY); err = uv_signal_start(LLUV_H(handle, uv_signal_t), lluv_on_signal_start, signum); if(err >= 0) lluv_handle_lock(L, handle, LLUV_LOCK_START); return lluv_return(L, handle, LLUV_START_CB(handle), err); }
LLUV_INTERNAL lluv_req_t* lluv_req_new(lua_State *L, uv_req_type type, lluv_handle_t *h){ size_t extra_size = uv_req_size(type) - sizeof(uv_req_t); lluv_req_t *req = (lluv_req_t*)lluv_alloc(L, sizeof(lluv_req_t) + extra_size); req->req.data = req; req->handle = h; req->cb = luaL_ref(L, LLUV_LUA_REGISTRY); req->arg = LUA_NOREF; req->ctx = LUA_NOREF; if(h) lluv_handle_lock(L, h, LLUV_LOCK_REQ); return req; }