diff options
| author | Mike Pall <mike> | 2013-04-21 01:00:01 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2013-04-21 01:00:01 +0200 |
| commit | 7b629b7bcf6bca3bd7733db601722c551098557e (patch) | |
| tree | 927a28b8eb4c13b198ce5bf8e66f19c89ddf77c9 | |
| parent | 9ead735159de2a83c6903360bec3f681e28ba10e (diff) | |
| download | luajit-7b629b7bcf6bca3bd7733db601722c551098557e.tar.gz luajit-7b629b7bcf6bca3bd7733db601722c551098557e.tar.bz2 luajit-7b629b7bcf6bca3bd7733db601722c551098557e.zip | |
Move buffer shrinking to atomic GC phase.
| -rw-r--r-- | src/lj_gc.c | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/src/lj_gc.c b/src/lj_gc.c index 4ce6eb19..c9eaf21a 100644 --- a/src/lj_gc.c +++ b/src/lj_gc.c | |||
| @@ -349,14 +349,6 @@ static size_t gc_propagate_gray(global_State *g) | |||
| 349 | 349 | ||
| 350 | /* -- Sweep phase --------------------------------------------------------- */ | 350 | /* -- Sweep phase --------------------------------------------------------- */ |
| 351 | 351 | ||
| 352 | /* Try to shrink some common data structures. */ | ||
| 353 | static void gc_shrink(global_State *g, lua_State *L) | ||
| 354 | { | ||
| 355 | if (g->strnum <= (g->strmask >> 2) && g->strmask > LJ_MIN_STRTAB*2-1) | ||
| 356 | lj_str_resize(L, g->strmask >> 1); /* Shrink string table. */ | ||
| 357 | lj_buf_shrink(L, &g->tmpbuf); /* Shrink temp buffer. */ | ||
| 358 | } | ||
| 359 | |||
| 360 | /* Type of GC free functions. */ | 352 | /* Type of GC free functions. */ |
| 361 | typedef void (LJ_FASTCALL *GCFreeFunc)(global_State *g, GCobj *o); | 353 | typedef void (LJ_FASTCALL *GCFreeFunc)(global_State *g, GCobj *o); |
| 362 | 354 | ||
| @@ -591,6 +583,8 @@ static void atomic(global_State *g, lua_State *L) | |||
| 591 | /* All marking done, clear weak tables. */ | 583 | /* All marking done, clear weak tables. */ |
| 592 | gc_clearweak(gcref(g->gc.weak)); | 584 | gc_clearweak(gcref(g->gc.weak)); |
| 593 | 585 | ||
| 586 | lj_buf_shrink(L, &g->tmpbuf); /* Shrink temp buffer. */ | ||
| 587 | |||
| 594 | /* Prepare for sweep phase. */ | 588 | /* Prepare for sweep phase. */ |
| 595 | g->gc.currentwhite = (uint8_t)otherwhite(g); /* Flip current white. */ | 589 | g->gc.currentwhite = (uint8_t)otherwhite(g); /* Flip current white. */ |
| 596 | g->strempty.marked = g->gc.currentwhite; | 590 | g->strempty.marked = g->gc.currentwhite; |
| @@ -631,7 +625,8 @@ static size_t gc_onestep(lua_State *L) | |||
| 631 | MSize old = g->gc.total; | 625 | MSize old = g->gc.total; |
| 632 | setmref(g->gc.sweep, gc_sweep(g, mref(g->gc.sweep, GCRef), GCSWEEPMAX)); | 626 | setmref(g->gc.sweep, gc_sweep(g, mref(g->gc.sweep, GCRef), GCSWEEPMAX)); |
| 633 | if (gcref(*mref(g->gc.sweep, GCRef)) == NULL) { | 627 | if (gcref(*mref(g->gc.sweep, GCRef)) == NULL) { |
| 634 | gc_shrink(g, L); | 628 | if (g->strnum <= (g->strmask >> 2) && g->strmask > LJ_MIN_STRTAB*2-1) |
| 629 | lj_str_resize(L, g->strmask >> 1); /* Shrink string table. */ | ||
| 635 | if (gcref(g->gc.mmudata)) { /* Need any finalizations? */ | 630 | if (gcref(g->gc.mmudata)) { /* Need any finalizations? */ |
| 636 | g->gc.state = GCSfinalize; | 631 | g->gc.state = GCSfinalize; |
| 637 | } else { /* Otherwise skip this phase to help the JIT. */ | 632 | } else { /* Otherwise skip this phase to help the JIT. */ |
