Fix. Cleanup all references in the reset function

This commit is contained in:
Alexey Melnichuk 2021-01-06 23:35:39 +03:00
parent af5a1c795c
commit 36adb515cc

View File

@ -130,31 +130,12 @@ static int lcurl_easy_to_s(lua_State *L){
return 1; return 1;
} }
static int lcurl_easy_cleanup(lua_State *L){ static int lcurl_easy_cleanup_storage(lua_State *L, lcurl_easy_t *p){
lcurl_easy_t *p = lcurl_geteasy(L); int top = lua_gettop(L);
int i; int i;
if(p->multi){ if(p->storage != LUA_NOREF){
LCURL_UNUSED_VAR CURLMcode code = lcurl__multi_remove_handle(L, p->multi, p); p->storage = lcurl_storage_free(L, p->storage);
//! @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;
} }
p->post = NULL; p->post = NULL;
@ -166,10 +147,6 @@ static int lcurl_easy_cleanup(lua_State *L){
p->url = NULL; p->url = NULL;
#endif #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.cb_ref);
luaL_unref(L, LCURL_LUA_REGISTRY, p->wr.ud_ref); luaL_unref(L, LCURL_LUA_REGISTRY, p->wr.ud_ref);
luaL_unref(L, LCURL_LUA_REGISTRY, p->rd.cb_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; 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); 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_pushnil(L);
lua_rawset(L, LCURL_USERVALUES); lua_rawset(L, LCURL_USERVALUES);
@ -305,15 +313,8 @@ static int lcurl_easy_reset(lua_State *L){
curl_easy_reset(p->curl); curl_easy_reset(p->curl);
lua_settop(L, 1); lua_settop(L, 1);
if(p->storage != LUA_NOREF){ lcurl_easy_cleanup_storage(L, p);
int i; p->storage = lcurl_storage_init(L);
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);
}
return 1; return 1;
} }