diff options
author | Mike Pall <mike> | 2013-10-14 19:31:24 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2013-10-14 19:31:24 +0200 |
commit | 5d25645a210f32dddecde9c50afb14f9ee63e180 (patch) | |
tree | b6cf446eb9c58f6d4e5ed0064c11d83cb2348b01 /src | |
parent | 3cdeb54a24047d1402a0c2d795888c0791f9157d (diff) | |
download | luajit-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.c | 7 | ||||
-rw-r--r-- | src/lj_obj.h | 2 | ||||
-rw-r--r-- | src/lj_tab.c | 7 | ||||
-rw-r--r-- | src/lj_tab.h | 3 |
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 | ||
355 | void lj_tab_rehash(lua_State *L, GCtab *t) | ||
356 | { | ||
357 | rehashtab(L, t, niltv(L)); | ||
358 | } | ||
359 | #endif | ||
360 | |||
354 | void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize) | 361 | void 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 |
40 | LJ_FUNCA GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt); | 40 | LJ_FUNCA GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt); |
41 | LJ_FUNC void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t); | 41 | LJ_FUNC void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t); |
42 | #if LJ_HASFFI | ||
43 | LJ_FUNC void lj_tab_rehash(lua_State *L, GCtab *t); | ||
44 | #endif | ||
42 | LJ_FUNCA void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize); | 45 | LJ_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! */ |