diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-05-12 06:28:43 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-05-12 06:28:43 +0000 |
commit | 430cabfad89206e286f2950b392cdf8d37755082 (patch) | |
tree | 6414da4f67c6640cd5d4e6159da146b6a3b1e13e /gc.c | |
parent | ab24f2b07729dc022cd954355d6797b48f1b1552 (diff) |
* gc.c (ruby_vm_xmalloc): increase malloc_increase only if malloc
succeeds. failed malloc size can be huge. it may increase
malloc_limit too big which cause less GC and memory full.
(ruby_vm_xrealloc): ditto.
(rb_objspace): make params.limit and params.increase size_t.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16388 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 10 |
1 files changed, 5 insertions, 5 deletions
@@ -145,8 +145,8 @@ struct gc_list { typedef struct rb_objspace { struct { - unsigned long limit; - unsigned long increase; + size_t limit; + size_t increase; } params; struct { size_t increment; @@ -314,9 +314,8 @@ ruby_vm_xmalloc(rb_objspace_t *objspace, size_t size) rb_raise(rb_eNoMemError, "negative allocation size (or too big)"); } if (size == 0) size = 1; - malloc_increase += size; - if (ruby_gc_stress || malloc_increase > malloc_limit) { + if (ruby_gc_stress || (malloc_increase+size) > malloc_limit) { garbage_collect(objspace); } RUBY_CRITICAL(mem = malloc(size)); @@ -328,6 +327,7 @@ ruby_vm_xmalloc(rb_objspace_t *objspace, size_t size) rb_memerror(); } } + malloc_increase += size; return mem; } @@ -381,7 +381,6 @@ ruby_vm_xrealloc(rb_objspace_t *objspace, void *ptr, size_t size) } if (!ptr) return ruby_xmalloc(size); if (size == 0) size = 1; - malloc_increase += size; if (ruby_gc_stress) garbage_collect(objspace); RUBY_CRITICAL(mem = realloc(ptr, size)); if (!mem) { @@ -392,6 +391,7 @@ ruby_vm_xrealloc(rb_objspace_t *objspace, void *ptr, size_t size) rb_memerror(); } } + malloc_increase += size; return mem; } |