Fix. Cleanup all references in the reset function
This commit is contained in:
parent
af5a1c795c
commit
36adb515cc
71
src/lceasy.c
71
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);
|
||||
lcurl_easy_cleanup_storage(L, p);
|
||||
p->storage = lcurl_storage_init(L);
|
||||
lua_settop(L, 1);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user