aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2013-10-14 19:31:24 +0200
committerMike Pall <mike>2013-10-14 19:31:24 +0200
commit5d25645a210f32dddecde9c50afb14f9ee63e180 (patch)
treeb6cf446eb9c58f6d4e5ed0064c11d83cb2348b01 /src
parent3cdeb54a24047d1402a0c2d795888c0791f9157d (diff)
downloadluajit-5d25645a210f32dddecde9c50afb14f9ee63e180.tar.gz
luajit-5d25645a210f32dddecde9c50afb14f9ee63e180.tar.bz2
luajit-5d25645a210f32dddecde9c50afb14f9ee63e180.zip
FFI: Rehash finalizer table after GC cycle, if needed.
Diffstat (limited to 'src')
-rw-r--r--src/lj_gc.c7
-rw-r--r--src/lj_obj.h2
-rw-r--r--src/lj_tab.c7
-rw-r--r--src/lj_tab.h3
4 files changed, 18 insertions, 1 deletions
diff --git a/src/lj_gc.c b/src/lj_gc.c
index 79f8b720..5c665786 100644
--- a/src/lj_gc.c
+++ b/src/lj_gc.c
@@ -501,6 +501,7 @@ static void gc_finalize(lua_State *L)
501 setcdataV(L, &tmp, gco2cd(o)); 501 setcdataV(L, &tmp, gco2cd(o));
502 tv = lj_tab_set(L, ctype_ctsG(g)->finalizer, &tmp); 502 tv = lj_tab_set(L, ctype_ctsG(g)->finalizer, &tmp);
503 if (!tvisnil(tv)) { 503 if (!tvisnil(tv)) {
504 g->gc.nocdatafin = 0;
504 copyTV(L, &tmp, tv); 505 copyTV(L, &tmp, tv);
505 setnilV(tv); /* Clear entry in finalizer table. */ 506 setnilV(tv); /* Clear entry in finalizer table. */
506 gc_call_finalizer(g, L, &tmp, o); 507 gc_call_finalizer(g, L, &tmp, o);
@@ -634,6 +635,9 @@ static size_t gc_onestep(lua_State *L)
634 gc_shrink(g, L); 635 gc_shrink(g, L);
635 if (gcref(g->gc.mmudata)) { /* Need any finalizations? */ 636 if (gcref(g->gc.mmudata)) { /* Need any finalizations? */
636 g->gc.state = GCSfinalize; 637 g->gc.state = GCSfinalize;
638#if LJ_HASFFI
639 g->gc.nocdatafin = 1;
640#endif
637 } else { /* Otherwise skip this phase to help the JIT. */ 641 } else { /* Otherwise skip this phase to help the JIT. */
638 g->gc.state = GCSpause; /* End of GC cycle. */ 642 g->gc.state = GCSpause; /* End of GC cycle. */
639 g->gc.debt = 0; 643 g->gc.debt = 0;
@@ -652,6 +656,9 @@ static size_t gc_onestep(lua_State *L)
652 g->gc.estimate -= GCFINALIZECOST; 656 g->gc.estimate -= GCFINALIZECOST;
653 return GCFINALIZECOST; 657 return GCFINALIZECOST;
654 } 658 }
659#if LJ_HASFFI
660 if (!g->gc.nocdatafin) lj_tab_rehash(L, ctype_ctsG(g)->finalizer);
661#endif
655 g->gc.state = GCSpause; /* End of GC cycle. */ 662 g->gc.state = GCSpause; /* End of GC cycle. */
656 g->gc.debt = 0; 663 g->gc.debt = 0;
657 return 0; 664 return 0;
diff --git a/src/lj_obj.h b/src/lj_obj.h
index b967819d..f8aed318 100644
--- a/src/lj_obj.h
+++ b/src/lj_obj.h
@@ -493,7 +493,7 @@ typedef struct GCState {
493 MSize threshold; /* Memory threshold. */ 493 MSize threshold; /* Memory threshold. */
494 uint8_t currentwhite; /* Current white color. */ 494 uint8_t currentwhite; /* Current white color. */
495 uint8_t state; /* GC state. */ 495 uint8_t state; /* GC state. */
496 uint8_t unused1; 496 uint8_t nocdatafin; /* No cdata finalizer called. */
497 uint8_t unused2; 497 uint8_t unused2;
498 MSize sweepstr; /* Sweep position in string table. */ 498 MSize sweepstr; /* Sweep position in string table. */
499 GCRef root; /* List of all collectable objects. */ 499 GCRef root; /* List of all collectable objects. */
diff --git a/src/lj_tab.c b/src/lj_tab.c
index ccad1f68..0a4bf107 100644
--- a/src/lj_tab.c
+++ b/src/lj_tab.c
@@ -351,6 +351,13 @@ static void rehashtab(lua_State *L, GCtab *t, cTValue *ek)
351 resizetab(L, t, asize, hsize2hbits(total)); 351 resizetab(L, t, asize, hsize2hbits(total));
352} 352}
353 353
354#if LJ_HASFFI
355void lj_tab_rehash(lua_State *L, GCtab *t)
356{
357 rehashtab(L, t, niltv(L));
358}
359#endif
360
354void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize) 361void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize)
355{ 362{
356 resizetab(L, t, nasize+1, t->hmask > 0 ? lj_fls(t->hmask)+1 : 0); 363 resizetab(L, t, nasize+1, t->hmask > 0 ? lj_fls(t->hmask)+1 : 0);
diff --git a/src/lj_tab.h b/src/lj_tab.h
index 2787caa0..98ded17e 100644
--- a/src/lj_tab.h
+++ b/src/lj_tab.h
@@ -39,6 +39,9 @@ LJ_FUNC GCtab * LJ_FASTCALL lj_tab_new1(lua_State *L, uint32_t ahsize);
39#endif 39#endif
40LJ_FUNCA GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt); 40LJ_FUNCA GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt);
41LJ_FUNC void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t); 41LJ_FUNC void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t);
42#if LJ_HASFFI
43LJ_FUNC void lj_tab_rehash(lua_State *L, GCtab *t);
44#endif
42LJ_FUNCA void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize); 45LJ_FUNCA void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize);
43 46
44/* Caveat: all getters except lj_tab_get() can return NULL! */ 47/* Caveat: all getters except lj_tab_get() can return NULL! */