@@ -130,31 +130,12 @@ static int lcurl_easy_to_s(lua_State *L){
130130 return 1 ;
131131}
132132
133- static int lcurl_easy_cleanup (lua_State * L ){
134- lcurl_easy_t * p = lcurl_geteasy (L );
133+ static int lcurl_easy_cleanup_storage (lua_State * L , lcurl_easy_t * p ){
134+ int top = lua_gettop (L );
135135 int i ;
136136
137- if (p -> multi ){
138- LCURL_UNUSED_VAR CURLMcode code = lcurl__multi_remove_handle (L , p -> multi , p );
139-
140- //! @todo what I can do if I can not remove it???
141- }
142-
143- if (p -> curl ){
144- lua_State * curL ;
145-
146- // In my tests when I cleanup some easy handle.
147- // timerfunction called only for single multi handle.
148- // Also may be this function may call `close` callback
149- // for `curl_mimepart` structure.
150- curL = p -> L ; lcurl__easy_assign_lua (L , p , L , 1 );
151- curl_easy_cleanup (p -> curl );
152- #ifndef LCURL_RESET_NULL_LUA
153- if (curL != NULL )
154- #endif
155- lcurl__easy_assign_lua (L , p , curL , 1 );
156-
157- p -> curl = NULL ;
137+ if (p -> storage != LUA_NOREF ){
138+ p -> storage = lcurl_storage_free (L , p -> storage );
158139 }
159140
160141 p -> post = NULL ;
@@ -166,10 +147,6 @@ static int lcurl_easy_cleanup(lua_State *L){
166147 p -> url = NULL ;
167148#endif
168149
169- if (p -> storage != LUA_NOREF ){
170- p -> storage = lcurl_storage_free (L , p -> storage );
171- }
172-
173150 luaL_unref (L , LCURL_LUA_REGISTRY , p -> wr .cb_ref );
174151 luaL_unref (L , LCURL_LUA_REGISTRY , p -> wr .ud_ref );
175152 luaL_unref (L , LCURL_LUA_REGISTRY , p -> rd .cb_ref );
@@ -222,7 +199,38 @@ static int lcurl_easy_cleanup(lua_State *L){
222199 p -> lists [i ] = LUA_NOREF ;
223200 }
224201
202+ assert (lua_gettop (L ) == top );
203+ }
204+
205+ static int lcurl_easy_cleanup (lua_State * L ){
206+ lcurl_easy_t * p = lcurl_geteasy (L );
225207 lua_settop (L , 1 );
208+
209+ if (p -> multi ){
210+ LCURL_UNUSED_VAR CURLMcode code = lcurl__multi_remove_handle (L , p -> multi , p );
211+
212+ //! @todo what I can do if I can not remove it???
213+ }
214+
215+ if (p -> curl ){
216+ lua_State * curL ;
217+
218+ // In my tests when I cleanup some easy handle.
219+ // timerfunction called only for single multi handle.
220+ // Also may be this function may call `close` callback
221+ // for `curl_mimepart` structure.
222+ curL = p -> L ; lcurl__easy_assign_lua (L , p , L , 1 );
223+ curl_easy_cleanup (p -> curl );
224+ #ifndef LCURL_RESET_NULL_LUA
225+ if (curL != NULL )
226+ #endif
227+ lcurl__easy_assign_lua (L , p , curL , 1 );
228+
229+ p -> curl = NULL ;
230+ }
231+
232+ lcurl_easy_cleanup_storage (L , p );
233+
226234 lua_pushnil (L );
227235 lua_rawset (L , LCURL_USERVALUES );
228236
@@ -305,15 +313,8 @@ static int lcurl_easy_reset(lua_State *L){
305313 curl_easy_reset (p -> curl );
306314 lua_settop (L , 1 );
307315
308- if (p -> storage != LUA_NOREF ){
309- int i ;
310- for (i = 0 ; i < LCURL_LIST_COUNT ; ++ i ) {
311- p -> lists [i ] = LUA_NOREF ;
312- }
313- lcurl_storage_free (L , p -> storage );
314- p -> storage = lcurl_storage_init (L );
315- lua_settop (L , 1 );
316- }
316+ lcurl_easy_cleanup_storage (L , p );
317+ p -> storage = lcurl_storage_init (L );
317318
318319 return 1 ;
319320}
0 commit comments