static int luv_new_work(lua_State* L) { size_t len; const char* buff; luv_work_ctx_t* ctx; buff = luv_thread_dumped(L, 1, &len); luaL_checktype(L, 2, LUA_TFUNCTION); if(!lua_isnoneornil(L, 3)) luaL_checktype(L, 3, LUA_TFUNCTION); ctx = lua_newuserdata(L, sizeof(*ctx)); memset(ctx, 0, sizeof(*ctx)); ctx->len = len; ctx->code = malloc(ctx->len); memcpy(ctx->code, buff, len); lua_pushvalue(L, 2); ctx->after_work_cb = luaL_ref(L, LUA_REGISTRYINDEX); if (lua_gettop(L) == 4) { lua_pushvalue(L, 3); ctx->async_cb = luaL_ref(L, LUA_REGISTRYINDEX); uv_async_init(luv_loop(L), &ctx->async, async_cb); } else ctx->async_cb = LUA_REFNIL; ctx->L = L; luaL_getmetatable(L, "luv_work_ctx"); lua_setmetatable(L, -2); return 1; }
static int luv_new_thread(lua_State* L) { int ret; size_t len; const char* buff; luv_thread_t* thread; int cbidx = 1; #if LUV_UV_VERSION_GEQ(1, 26, 0) uv_thread_options_t options; options.flags = UV_THREAD_NO_FLAGS; #endif thread = (luv_thread_t*)lua_newuserdata(L, sizeof(*thread)); memset(thread, 0, sizeof(*thread)); luaL_getmetatable(L, "uv_thread"); lua_setmetatable(L, -2); #if LUV_UV_VERSION_GEQ(1, 26, 0) if (lua_type(L, 1) == LUA_TTABLE) { cbidx++; lua_getfield(L, 1, "stack_size"); if (!lua_isnil(L, -1)) { options.flags |= UV_THREAD_HAS_STACK_SIZE; if (lua_isnumber(L, -1)) { options.stack_size = lua_tointeger(L, -1); } else { return luaL_argerror(L, 1, "stack_size option must be a number if set"); } } lua_pop(L, 1); } #endif buff = luv_thread_dumped(L, cbidx, &len); //clear in luv_thread_gc or in child threads thread->argc = luv_thread_arg_set(L, &thread->arg, cbidx+1, lua_gettop(L) - 1, LUVF_THREAD_UHANDLE); thread->len = len; thread->code = (char*)malloc(thread->len); memcpy(thread->code, buff, len); #if LUV_UV_VERSION_GEQ(1, 26, 0) ret = uv_thread_create_ex(&thread->handle, &options, luv_thread_cb, thread); #else ret = uv_thread_create(&thread->handle, luv_thread_cb, thread); #endif if (ret < 0) return luv_error(L, ret); return 1; }
static int luv_new_thread(lua_State* L) { int ret; size_t len; const char* buff; luv_thread_t* thread; thread = lua_newuserdata(L, sizeof(*thread)); memset(thread, 0, sizeof(*thread)); luaL_getmetatable(L, "uv_thread"); lua_setmetatable(L, -2); buff = luv_thread_dumped(L, 1, &len); thread->argc = luv_thread_arg_set(L, &thread->arg, 2, lua_gettop(L) - 1, 1); thread->len = len; thread->code = malloc(thread->len); memcpy(thread->code, buff, len); ret = uv_thread_create(&thread->handle, luv_thread_cb, thread); if (ret < 0) return luv_error(L, ret); return 1; }