From 44876ec99f3a772e15aa7a8a9b5134356fc6cc16 Mon Sep 17 00:00:00 2001
From: Mike Pall <mike>
Date: Wed, 11 Apr 2012 15:15:50 +0200
Subject: Limit number of userdata __gc separations at state close.

---
 src/lj_state.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

(limited to 'src')

diff --git a/src/lj_state.c b/src/lj_state.c
index 711869a2..77c6df67 100644
--- a/src/lj_state.c
+++ b/src/lj_state.c
@@ -234,6 +234,7 @@ static TValue *cpfinalize(lua_State *L, lua_CFunction dummy, void *ud)
 LUA_API void lua_close(lua_State *L)
 {
   global_State *g = G(L);
+  int i;
   L = mainthread(g);  /* Only the main thread can be closed. */
   lj_func_closeuv(L, tvref(L->stack));
   lj_gc_separateudata(g, 1);  /* Separate udata which have GC metamethods. */
@@ -242,7 +243,7 @@ LUA_API void lua_close(lua_State *L)
   G2J(g)->state = LJ_TRACE_IDLE;
   lj_dispatch_update(g);
 #endif
-  for (;;) {
+  for (i = 0; i < 10; ) {
     hook_enter(g);
     L->status = 0;
     L->cframe = NULL;
@@ -251,6 +252,7 @@ LUA_API void lua_close(lua_State *L)
       lj_gc_separateudata(g, 1);  /* Separate udata again. */
       if (gcref(g->gc.mmudata) == NULL)  /* Until nothing is left to do. */
 	break;
+      i++;
     }
   }
   close_state(L);
-- 
cgit v1.2.3-55-g6feb