diff --git a/src/lceasy.c b/src/lceasy.c index 6bfdd84..318c55c 100644 --- a/src/lceasy.c +++ b/src/lceasy.c @@ -130,31 +130,12 @@ static int lcurl_easy_to_s(lua_State *L){ return 1; } -static int lcurl_easy_cleanup(lua_State *L){ - lcurl_easy_t *p = lcurl_geteasy(L); +static int lcurl_easy_cleanup_storage(lua_State *L, lcurl_easy_t *p){ + int top = lua_gettop(L); int i; - if(p->multi){ - LCURL_UNUSED_VAR CURLMcode code = lcurl__multi_remove_handle(L, p->multi, p); - - //! @todo what I can do if I can not remove it??? - } - - if(p->curl){ - lua_State *curL; - - // In my tests when I cleanup some easy handle. - // timerfunction called only for single multi handle. - // Also may be this function may call `close` callback - // for `curl_mimepart` structure. - curL = p->L; lcurl__easy_assign_lua(L, p, L, 1); - curl_easy_cleanup(p->curl); -#ifndef LCURL_RESET_NULL_LUA - if(curL != NULL) -#endif - lcurl__easy_assign_lua(L, p, curL, 1); - - p->curl = NULL; + if(p->storage != LUA_NOREF){ + p->storage = lcurl_storage_free(L, p->storage); } p->post = NULL; @@ -166,10 +147,6 @@ static int lcurl_easy_cleanup(lua_State *L){ p->url = NULL; #endif - if(p->storage != LUA_NOREF){ - p->storage = lcurl_storage_free(L, p->storage); - } - luaL_unref(L, LCURL_LUA_REGISTRY, p->wr.cb_ref); luaL_unref(L, LCURL_LUA_REGISTRY, p->wr.ud_ref); luaL_unref(L, LCURL_LUA_REGISTRY, p->rd.cb_ref); @@ -222,7 +199,38 @@ static int lcurl_easy_cleanup(lua_State *L){ p->lists[i] = LUA_NOREF; } + assert(lua_gettop(L) == top); +} + +static int lcurl_easy_cleanup(lua_State *L){ + lcurl_easy_t *p = lcurl_geteasy(L); lua_settop(L, 1); + + if(p->multi){ + LCURL_UNUSED_VAR CURLMcode code = lcurl__multi_remove_handle(L, p->multi, p); + + //! @todo what I can do if I can not remove it??? + } + + if(p->curl){ + lua_State *curL; + + // In my tests when I cleanup some easy handle. + // timerfunction called only for single multi handle. + // Also may be this function may call `close` callback + // for `curl_mimepart` structure. + curL = p->L; lcurl__easy_assign_lua(L, p, L, 1); + curl_easy_cleanup(p->curl); +#ifndef LCURL_RESET_NULL_LUA + if(curL != NULL) +#endif + lcurl__easy_assign_lua(L, p, curL, 1); + + p->curl = NULL; + } + + lcurl_easy_cleanup_storage(L, p); + lua_pushnil(L); lua_rawset(L, LCURL_USERVALUES); @@ -305,15 +313,8 @@ static int lcurl_easy_reset(lua_State *L){ curl_easy_reset(p->curl); lua_settop(L, 1); - if(p->storage != LUA_NOREF){ - int i; - for (i = 0; i < LCURL_LIST_COUNT; ++i) { - p->lists[i] = LUA_NOREF; - } - lcurl_storage_free(L, p->storage); - p->storage = lcurl_storage_init(L); - lua_settop(L, 1); - } + lcurl_easy_cleanup_storage(L, p); + p->storage = lcurl_storage_init(L); return 1; }