Skip to content

Commit

Permalink
restore type cache pruning in sysimage saving
Browse files Browse the repository at this point in the history
  • Loading branch information
JeffBezanson committed Sep 30, 2020
1 parent a025f00 commit 2719879
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 30 deletions.
12 changes: 0 additions & 12 deletions src/dump.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ static jl_value_t *jl_idtable_type = NULL;
static jl_typename_t *jl_idtable_typename = NULL;
static jl_value_t *jl_bigint_type = NULL;
static int gmp_limb_size = 0;
static arraylist_t builtin_typenames;

static void write_uint64(ios_t *s, uint64_t i) JL_NOTSAFEPOINT
{
Expand Down Expand Up @@ -2649,17 +2648,6 @@ void jl_init_serializer(void)
i += 1;
}
assert(i <= 256);

arraylist_new(&builtin_typenames, 0);
arraylist_push(&builtin_typenames, jl_array_typename);
arraylist_push(&builtin_typenames, ((jl_datatype_t*)jl_ref_type->body)->name);
arraylist_push(&builtin_typenames, jl_pointer_typename);
arraylist_push(&builtin_typenames, jl_type_typename);
arraylist_push(&builtin_typenames, ((jl_datatype_t*)jl_unwrap_unionall((jl_value_t*)jl_abstractarray_type))->name);
arraylist_push(&builtin_typenames, ((jl_datatype_t*)jl_unwrap_unionall((jl_value_t*)jl_densearray_type))->name);
arraylist_push(&builtin_typenames, jl_tuple_typename);
arraylist_push(&builtin_typenames, jl_vararg_typename);
arraylist_push(&builtin_typenames, jl_namedtuple_typename);
}

#ifdef __cplusplus
Expand Down
10 changes: 10 additions & 0 deletions src/jltypes.c
Original file line number Diff line number Diff line change
Expand Up @@ -808,6 +808,16 @@ static jl_svec_t *cache_rehash_set(jl_svec_t *a, size_t newsz)
}
}

void jl_rehash_type_cache(jl_typename_t *name)
{
size_t sz = jl_svec_len(name->cache);
jl_svec_t *newa = cache_rehash_set(name->cache, sz);
assert(jl_svec_len(newa) == sz);
size_t i;
for (i = 0; i < sz; i++)
jl_svecset(name->cache, i, jl_svecref(newa, i));
}

static void cache_insert_type_linear(jl_datatype_t *type, ssize_t insert_at)
{
jl_svec_t *cache = type->name->linearcache;
Expand Down
1 change: 1 addition & 0 deletions src/julia_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,7 @@ jl_value_t *jl_wrap_vararg(jl_value_t *t, jl_value_t *n);
void jl_reinstantiate_inner_types(jl_datatype_t *t);
jl_datatype_t *jl_lookup_cache_type_(jl_datatype_t *type);
void jl_cache_type_(jl_datatype_t *type);
void jl_rehash_type_cache(jl_typename_t *name);
void jl_assign_bits(void *dest, jl_value_t *bits) JL_NOTSAFEPOINT;
void set_nth_field(jl_datatype_t *st, void *v, size_t i, jl_value_t *rhs) JL_NOTSAFEPOINT;
jl_expr_t *jl_exprn(jl_sym_t *head, size_t n);
Expand Down
45 changes: 27 additions & 18 deletions src/staticdata.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,6 @@ static arraylist_t deser_sym;
static htable_t backref_table;
static int backref_table_numel;
static arraylist_t layout_table;
static arraylist_t builtin_typenames;

// list of (size_t pos, (void *f)(jl_value_t*)) entries
// for the serializer to mark values in need of rework by function f
Expand Down Expand Up @@ -259,8 +258,8 @@ static uintptr_t jl_fptr_id(void *fptr)
return *(uintptr_t*)pbp;
}

#define jl_serialize_value(s, v) jl_serialize_value_(s,(jl_value_t*)(v))
static void jl_serialize_value_(jl_serializer_state *s, jl_value_t *v);
#define jl_serialize_value(s, v) jl_serialize_value_(s,(jl_value_t*)(v),1)
static void jl_serialize_value_(jl_serializer_state *s, jl_value_t *v, int recursive);


static void jl_serialize_module(jl_serializer_state *s, jl_module_t *m)
Expand All @@ -287,7 +286,7 @@ static void jl_serialize_module(jl_serializer_state *s, jl_module_t *m)

#define NBOX_C 1024

static void jl_serialize_value_(jl_serializer_state *s, jl_value_t *v)
static void jl_serialize_value_(jl_serializer_state *s, jl_value_t *v, int recursive)
{
// ignore items that are given a special representation
if (v == NULL || jl_is_symbol(v)) {
Expand Down Expand Up @@ -331,6 +330,8 @@ static void jl_serialize_value_(jl_serializer_state *s, jl_value_t *v)
// skip it
}
else if (jl_is_svec(v)) {
if (!recursive)
return;
size_t i, l = jl_svec_len(v);
jl_value_t **data = jl_svec_data(v);
for (i = 0; i < l; i++) {
Expand Down Expand Up @@ -366,6 +367,17 @@ static void jl_serialize_value_(jl_serializer_state *s, jl_value_t *v)
else if (jl_typeis(v, jl_module_type)) {
jl_serialize_module(s, (jl_module_t*)v);
}
else if (jl_is_typename(v)) {
jl_typename_t *tn = (jl_typename_t*)v;
jl_serialize_value(s, tn->name);
jl_serialize_value(s, tn->module);
jl_serialize_value(s, tn->names);
jl_serialize_value(s, tn->wrapper);
jl_serialize_value_(s, (jl_value_t*)tn->cache, 0);
jl_serialize_value_(s, (jl_value_t*)tn->linearcache, 0);
jl_serialize_value(s, tn->mt);
jl_serialize_value(s, tn->partial);
}
else if (t->layout->nfields > 0) {
char *data = (char*)jl_data_ptr(v);
size_t i, np = t->layout->npointers;
Expand Down Expand Up @@ -1235,7 +1247,7 @@ static void jl_finalize_serializer(jl_serializer_state *s, arraylist_t *list)
}


static void jl_reinit_item(jl_value_t *v, int how)
static void jl_reinit_item(jl_value_t *v, int how) JL_GC_DISABLED
{
switch (how) {
case 1: { // rehash IdDict
Expand Down Expand Up @@ -1280,7 +1292,7 @@ static void jl_reinit_item(jl_value_t *v, int how)
}


static void jl_finalize_deserializer(jl_serializer_state *s)
static void jl_finalize_deserializer(jl_serializer_state *s) JL_GC_DISABLED
{
// run reinitialization functions
uintptr_t base = (uintptr_t)&s->s->buf[0];
Expand All @@ -1304,7 +1316,7 @@ static void jl_prune_type_cache(jl_svec_t *cache)
for (i = 0; i < l; i++) {
jl_value_t *ti = jl_svecref(cache, i);
if (ti == NULL)
break;
continue;
if (ptrhash_get(&backref_table, ti) != HT_NOTFOUND || jl_get_llvm_gv(native_functions, ti) != 0)
jl_svecset(cache, ins++, ti);
else if (jl_is_datatype(ti)) {
Expand All @@ -1325,7 +1337,7 @@ static void jl_prune_type_cache(jl_svec_t *cache)
static void jl_init_serializer2(int);
static void jl_cleanup_serializer2(void);

static void jl_save_system_image_to_stream(ios_t *f)
static void jl_save_system_image_to_stream(ios_t *f) JL_GC_DISABLED
{
jl_gc_collect(JL_GC_FULL);
jl_gc_collect(JL_GC_INCREMENTAL); // sweep finalizers
Expand Down Expand Up @@ -1376,15 +1388,14 @@ static void jl_save_system_image_to_stream(ios_t *f)
jl_value_t *tag = *tags[i];
jl_serialize_value(&s, tag);
}
for (i = 0; i < builtin_typenames.len; i++) {
jl_typename_t *tn = (jl_typename_t*)builtin_typenames.items[i];
// prune unused entries from built-in type caches
for (i = 0; i < backref_table.size; i += 2) {
jl_typename_t *tn = (jl_typename_t*)backref_table.table[i];
if (tn == HT_NOTFOUND || !jl_is_typename(tn))
continue;
jl_prune_type_cache(tn->cache);
jl_prune_type_cache(tn->linearcache);
}
for (i = 0; i < builtin_typenames.len; i++) {
jl_typename_t *tn = (jl_typename_t*)builtin_typenames.items[i];
jl_serialize_value(&s, tn->cache);
jl_serialize_value(&s, tn->linearcache);
jl_rehash_type_cache(tn); // put values back in correct locations
}
}

Expand Down Expand Up @@ -1509,7 +1520,7 @@ JL_DLLEXPORT void jl_set_sysimg_so(void *handle)
sysimg_fptrs = jl_init_processor_sysimg(handle);
}

static void jl_restore_system_image_from_stream(ios_t *f)
static void jl_restore_system_image_from_stream(ios_t *f) JL_GC_DISABLED
{
JL_TIMING(SYSIMG_LOAD);
int en = jl_gc_enable(0);
Expand Down Expand Up @@ -1686,7 +1697,6 @@ static void jl_init_serializer2(int for_serialize)
htable_new(&symbol_table, 0);
htable_new(&fptr_to_id, sizeof(id_to_fptrs) / sizeof(*id_to_fptrs));
htable_new(&backref_table, 0);
arraylist_new(&builtin_typenames, 0);
uintptr_t i;
for (i = 0; id_to_fptrs[i] != NULL; i++) {
ptrhash_put(&fptr_to_id, (void*)(uintptr_t)id_to_fptrs[i], (void*)(i + 2));
Expand All @@ -1704,7 +1714,6 @@ static void jl_cleanup_serializer2(void)
htable_reset(&fptr_to_id, 0);
htable_reset(&backref_table, 0);
arraylist_free(&deser_sym);
arraylist_free(&builtin_typenames);
}

#ifdef __cplusplus
Expand Down

0 comments on commit 2719879

Please sign in to comment.