diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2003-02-10 15:32:50 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2003-02-10 15:32:50 -0200 |
commit | 6f207b15fb20f1c7d06224354cfdf5e32fdbba68 (patch) | |
tree | c81ec4d1d2efe14db873dbb1a589c54d4be21ae2 /lgc.c | |
parent | 3184314bf32ce146fad2e4adc302c840497d5cde (diff) | |
download | lua-6f207b15fb20f1c7d06224354cfdf5e32fdbba68.tar.gz lua-6f207b15fb20f1c7d06224354cfdf5e32fdbba68.tar.bz2 lua-6f207b15fb20f1c7d06224354cfdf5e32fdbba68.zip |
resist errors in finalizers during lua_close
Diffstat (limited to 'lgc.c')
-rw-r--r-- | lgc.c | 16 |
1 files changed, 5 insertions, 11 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 1.166 2002/12/04 17:38:31 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 1.167 2002/12/19 11:11:55 roberto Exp roberto $ |
3 | ** Garbage Collector | 3 | ** Garbage Collector |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -110,7 +110,7 @@ static void marktmu (GCState *st) { | |||
110 | 110 | ||
111 | 111 | ||
112 | /* move `dead' udata that need finalization to list `tmudata' */ | 112 | /* move `dead' udata that need finalization to list `tmudata' */ |
113 | static void separateudata (lua_State *L) { | 113 | void luaC_separateudata (lua_State *L) { |
114 | GCObject **p = &G(L)->rootudata; | 114 | GCObject **p = &G(L)->rootudata; |
115 | GCObject *curr; | 115 | GCObject *curr; |
116 | GCObject *collected = NULL; /* to collect udata with gc event */ | 116 | GCObject *collected = NULL; /* to collect udata with gc event */ |
@@ -411,7 +411,7 @@ static void do1gcTM (lua_State *L, Udata *udata) { | |||
411 | } | 411 | } |
412 | 412 | ||
413 | 413 | ||
414 | static void callGCTM (lua_State *L) { | 414 | void luaC_callGCTM (lua_State *L) { |
415 | lu_byte oldah = L->allowhook; | 415 | lu_byte oldah = L->allowhook; |
416 | L->allowhook = 0; /* stop debug hooks during GC tag methods */ | 416 | L->allowhook = 0; /* stop debug hooks during GC tag methods */ |
417 | L->top++; /* reserve space to keep udata while runs its gc method */ | 417 | L->top++; /* reserve space to keep udata while runs its gc method */ |
@@ -431,12 +431,6 @@ static void callGCTM (lua_State *L) { | |||
431 | } | 431 | } |
432 | 432 | ||
433 | 433 | ||
434 | void luaC_callallgcTM (lua_State *L) { | ||
435 | separateudata(L); | ||
436 | callGCTM(L); /* call their GC tag methods */ | ||
437 | } | ||
438 | |||
439 | |||
440 | void luaC_sweep (lua_State *L, int all) { | 434 | void luaC_sweep (lua_State *L, int all) { |
441 | if (all) all = 256; /* larger than any mark */ | 435 | if (all) all = 256; /* larger than any mark */ |
442 | sweeplist(L, &G(L)->rootudata, all); | 436 | sweeplist(L, &G(L)->rootudata, all); |
@@ -469,7 +463,7 @@ static void mark (lua_State *L) { | |||
469 | wkv = st.wkv; /* keys must be cleared after preserving udata */ | 463 | wkv = st.wkv; /* keys must be cleared after preserving udata */ |
470 | st.wkv = NULL; | 464 | st.wkv = NULL; |
471 | st.wv = NULL; | 465 | st.wv = NULL; |
472 | separateudata(L); /* separate userdata to be preserved */ | 466 | luaC_separateudata(L); /* separate userdata to be preserved */ |
473 | marktmu(&st); /* mark `preserved' userdata */ | 467 | marktmu(&st); /* mark `preserved' userdata */ |
474 | propagatemarks(&st); /* remark, to propagate `preserveness' */ | 468 | propagatemarks(&st); /* remark, to propagate `preserveness' */ |
475 | cleartablekeys(wkv); | 469 | cleartablekeys(wkv); |
@@ -485,7 +479,7 @@ void luaC_collectgarbage (lua_State *L) { | |||
485 | mark(L); | 479 | mark(L); |
486 | luaC_sweep(L, 0); | 480 | luaC_sweep(L, 0); |
487 | checkSizes(L); | 481 | checkSizes(L); |
488 | callGCTM(L); | 482 | luaC_callGCTM(L); |
489 | } | 483 | } |
490 | 484 | ||
491 | 485 | ||