mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
gc.c: simple array for wmap
* gc.c (wmap_finalize, wmap_aset_update): use simple malloced array instead of T_ARRAY, to reduce GC pressure. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44119 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
27947a449f
commit
cdc2eeda6a
2 changed files with 41 additions and 18 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Tue Dec 10 17:21:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* gc.c (wmap_finalize, wmap_aset_update): use simple malloced array
|
||||||
|
instead of T_ARRAY, to reduce GC pressure.
|
||||||
|
|
||||||
Tue Dec 10 15:56:48 2013 Aman Gupta <ruby@tmm1.net>
|
Tue Dec 10 15:56:48 2013 Aman Gupta <ruby@tmm1.net>
|
||||||
|
|
||||||
* gc.c (reflist_add): revert changes from r44109. it is unnecessary
|
* gc.c (reflist_add): revert changes from r44109. it is unnecessary
|
||||||
|
|
54
gc.c
54
gc.c
|
@ -6235,7 +6235,6 @@ wmap_mark_map(st_data_t key, st_data_t val, st_data_t arg)
|
||||||
rb_objspace_t *objspace = (rb_objspace_t *)arg;
|
rb_objspace_t *objspace = (rb_objspace_t *)arg;
|
||||||
VALUE obj = (VALUE)val;
|
VALUE obj = (VALUE)val;
|
||||||
if (!is_live_object(objspace, obj)) return ST_DELETE;
|
if (!is_live_object(objspace, obj)) return ST_DELETE;
|
||||||
gc_mark_ptr(objspace, obj);
|
|
||||||
return ST_CONTINUE;
|
return ST_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6250,7 +6249,8 @@ wmap_mark(void *ptr)
|
||||||
static int
|
static int
|
||||||
wmap_free_map(st_data_t key, st_data_t val, st_data_t arg)
|
wmap_free_map(st_data_t key, st_data_t val, st_data_t arg)
|
||||||
{
|
{
|
||||||
rb_ary_resize((VALUE)val, 0);
|
VALUE *ptr = (VALUE *)val;
|
||||||
|
ruby_sized_xfree(ptr, (ptr[0] + 1) * sizeof(VALUE));
|
||||||
return ST_CONTINUE;
|
return ST_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6263,11 +6263,11 @@ wmap_free(void *ptr)
|
||||||
st_free_table(w->wmap2obj);
|
st_free_table(w->wmap2obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t rb_ary_memsize(VALUE ary);
|
|
||||||
static int
|
static int
|
||||||
wmap_memsize_map(st_data_t key, st_data_t val, st_data_t arg)
|
wmap_memsize_map(st_data_t key, st_data_t val, st_data_t arg)
|
||||||
{
|
{
|
||||||
*(size_t *)arg += rb_ary_memsize((VALUE)val);
|
VALUE *ptr = (VALUE *)val;
|
||||||
|
*(size_t *)arg += (ptr[0] + 1) * sizeof(VALUE);
|
||||||
return ST_CONTINUE;
|
return ST_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6308,11 +6308,22 @@ wmap_allocate(VALUE klass)
|
||||||
static int
|
static int
|
||||||
wmap_final_func(st_data_t *key, st_data_t *value, st_data_t arg, int existing)
|
wmap_final_func(st_data_t *key, st_data_t *value, st_data_t arg, int existing)
|
||||||
{
|
{
|
||||||
VALUE wmap, ary;
|
VALUE wmap, *ptr, size, i, j;
|
||||||
if (!existing) return ST_STOP;
|
if (!existing) return ST_STOP;
|
||||||
wmap = (VALUE)arg, ary = (VALUE)*value;
|
wmap = (VALUE)arg, ptr = (VALUE *)*value;
|
||||||
rb_ary_delete_same(ary, wmap);
|
for (i = j = 1, size = ptr[0]; i <= size; ++i) {
|
||||||
if (!RARRAY_LEN(ary)) return ST_DELETE;
|
if (ptr[i] != wmap) {
|
||||||
|
ptr[j++] = ptr[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (j == 1) {
|
||||||
|
ruby_sized_xfree(ptr, i * sizeof(VALUE));
|
||||||
|
return ST_DELETE;
|
||||||
|
}
|
||||||
|
if (j < i) {
|
||||||
|
ptr = ruby_sized_xrealloc2(ptr, j, sizeof(VALUE), i);
|
||||||
|
ptr[0] = j;
|
||||||
|
}
|
||||||
return ST_CONTINUE;
|
return ST_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6320,8 +6331,7 @@ static VALUE
|
||||||
wmap_finalize(VALUE self, VALUE objid)
|
wmap_finalize(VALUE self, VALUE objid)
|
||||||
{
|
{
|
||||||
st_data_t orig, wmap, data;
|
st_data_t orig, wmap, data;
|
||||||
VALUE obj, rids;
|
VALUE obj, *rids, i, size;
|
||||||
long i;
|
|
||||||
struct weakmap *w;
|
struct weakmap *w;
|
||||||
|
|
||||||
TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w);
|
TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w);
|
||||||
|
@ -6331,11 +6341,13 @@ wmap_finalize(VALUE self, VALUE objid)
|
||||||
/* obj is original referenced object and/or weak reference. */
|
/* obj is original referenced object and/or weak reference. */
|
||||||
orig = (st_data_t)obj;
|
orig = (st_data_t)obj;
|
||||||
if (st_delete(w->obj2wmap, &orig, &data)) {
|
if (st_delete(w->obj2wmap, &orig, &data)) {
|
||||||
rids = (VALUE)data;
|
rids = (VALUE *)data;
|
||||||
for (i = 0; i < RARRAY_LEN(rids); ++i) {
|
size = *rids++;
|
||||||
wmap = (st_data_t)RARRAY_AREF(rids, i);
|
for (i = 0; i < size; ++i) {
|
||||||
|
wmap = (st_data_t)rids[i];
|
||||||
st_delete(w->wmap2obj, &wmap, NULL);
|
st_delete(w->wmap2obj, &wmap, NULL);
|
||||||
}
|
}
|
||||||
|
ruby_sized_xfree((VALUE *)data, (size + 1) * sizeof(VALUE));
|
||||||
}
|
}
|
||||||
|
|
||||||
wmap = (st_data_t)obj;
|
wmap = (st_data_t)obj;
|
||||||
|
@ -6511,15 +6523,21 @@ wmap_values(VALUE self)
|
||||||
static int
|
static int
|
||||||
wmap_aset_update(st_data_t *key, st_data_t *val, st_data_t arg, int existing)
|
wmap_aset_update(st_data_t *key, st_data_t *val, st_data_t arg, int existing)
|
||||||
{
|
{
|
||||||
|
VALUE size, *ptr, *optr;
|
||||||
if (existing) {
|
if (existing) {
|
||||||
rb_ary_push((VALUE)*val, (VALUE)arg);
|
size = (ptr = optr = (VALUE *)*val)[0];
|
||||||
return ST_STOP;
|
++size;
|
||||||
|
ptr = ruby_sized_xrealloc2(ptr, size + 1, sizeof(VALUE), size);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
VALUE ary = rb_ary_tmp_new(1);
|
optr = 0;
|
||||||
*val = (st_data_t)ary;
|
size = 1;
|
||||||
rb_ary_push(ary, (VALUE)arg);
|
ptr = ruby_xmalloc2(2, sizeof(VALUE));
|
||||||
}
|
}
|
||||||
|
ptr[0] = size;
|
||||||
|
ptr[size] = (VALUE)arg;
|
||||||
|
if (ptr == optr) return ST_STOP;
|
||||||
|
*val = (st_data_t)ptr;
|
||||||
return ST_CONTINUE;
|
return ST_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue