[#36647] test/pathname/test_pathname.rb — TAKANO Mitsuhiro <takano32@...>
高野です。
[#36649] Embedding struct RArray — "Yugui (Yuki Sonoda)" <yugui@...>
-----BEGIN PGP SIGNED MESSAGE-----
[#36672] [Bug #616] instance_eval and Module#to_s — Shyouhei Urabe <redmine@...>
Bug #616: instance_eval and Module#to_s
[#36678] test_process.rb — TAKANO Mitsuhiro <takano32@...>
高野です。
まつもと ゆきひろです
高野です。
[#36685] [Bug #621] When to call Class#inherited — Shyouhei Urabe <redmine@...>
Bug #621: When to call Class#inherited
[#36691] [Bug:1.9] ArgumentError on "%c" % 0x80 — Tanaka Akira <akr@...>
"%c" % 0x80 が例外になります。
[#36697] [Bug:1.9] rb_io_fread does not work — "Yusuke ENDOH" <mame@...>
遠藤です。
[#36704] Assertion failed in array.c on mswin32 Ruby (trunk) — Masaki Suketa <masaki.suketa@...>
助田です。
こんにちは、なかむら(う)です。
こんにちは、なかむら(う)です。
[#36705] ruby1.9 on hppa build problem — Hideki Yamane <henrich@...>
こんにちは、
[#36706] Ruby on Vista — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
[#36716] [Bug #644] compile error on win32ole with VC++6 — Usaku NAKAMURA <redmine@...>
Bug #644: compile error on win32ole with VC++6
[#36739] r19786 (trunk): * lib/delegate.rb (Delegator): simplified and restored 1.8 — Fujioka <fuj@...>
藤岡です。
[#36750] [Bug #650] Marshal.load raises RegexpError — Shyouhei Urabe <redmine@...>
Bug #650: Marshal.load raises RegexpError
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
Yukihiro Matsumoto さんは書きました:
まつもと ゆきひろです
もとの正規表現にバグがあるのは認めますが、それに巻き込まれてでかいPStore
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
けいじゅ@いしつかです.
卜部です。
けいじゅ@いしつかです.
卜部です。
[#36753] [Bug #651] Regexp.new returns strange regexp object — Shyouhei Urabe <redmine@...>
Bug #651: Regexp.new returns strange regexp object
まつもと ゆきひろです
[#36764] Re: [ruby-cvs:27036] Ruby:r19818 (trunk): * transcode.c (str_transcode0): String#encode without argument now — Martin Duerst <duerst@...>
まつもとさん、こんばんは。
まつもと ゆきひろです
まつもとさん、こんにちは。
In article <6.0.0.20.2.20081019182600.08d852a8@localhost>,
ファイル名は以前の議論の結果「変換可能でしたら変換、そうでなかったら
In article <6.0.0.20.2.20081021093404.0ada7bf8@localhost>,
At 10:47 08/10/21, Tanaka Akira wrote:
[#36768] Re: [ruby-cvs:27042] Ruby:r19824 (trunk): * array.c: recycle shared-array when it isn't referenced. — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
ワナベです。
[#36774] ConverterNotFoundError while making Ruby in Windows(trunk) — Masaki Suketa <masaki.suketa@...>
助田です。
こんにちは、なかむら(う)です。
こんにちは、なかむら(う)です。
In article <20081020173718.7FAD.C613B076@garbagecollect.jp>,
[#36789] [Bug #660] 数字を3桁ずつコンマで区切るsprintf書式指定 — "rubikitch ." <redmine@...>
Bug #660: 数字を3桁ずつコンマで区切るsprintf書式指定
[#36801] Marshal.load can't take GZipReader — arton <artonx@...>
artonです。
まつもと ゆきひろです
[#36813] Re: Ruby:r19863 (trunk): * regparse.c (parse_char_class): CCV_SB is only for single — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
[#36866] [Bug #676] 引数の有無によるIO#readの挙動の違い — _ wanabe <redmine@...>
Bug #676: 引数の有無によるIO#readの挙動の違い
[#36877] [Feature #679] Integer#to_s(:step=>3, :sep=>",") が欲しい — Martin Dürst <redmine@...>
チケット #679 が更新されました。 (by Martin Dürst)
[#36909] trunk SEGV nkf? — "WATANABE Tetsuya" <tetsuya.watanabe@...>
渡辺哲也です。
[#36914] prefix math_* funcs — Tadashi Saito <shiba@...2.accsnet.ne.jp>
斎藤と申します。
> complex.cで使うために、いくつか数学関数からstaticがとれたようですが、
[#36915] prefix signal_buff — Tadashi Saito <shiba@...2.accsnet.ne.jp>
斎藤と申します。
[#36917] VMまわりのシンボルにも「rb_」を付けてほしい — Tadashi Saito <shiba@...2.accsnet.ne.jp>
斎藤と申します。連投ですみません。
[#36932] [Bug #6] sprintf() of %f on Windows(MSVCRT) — _ wanabe <redmine@...>
チケット #6 が更新されました。 (by _ wanabe)
[#36937] initial value of $. — "Yugui (Yuki Sonoda)" <yugui@...>
Yuguiです。
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
[#36993] [Bug:1.9] removing Exception#initialize dumps core — "Yusuke ENDOH" <mame@...>
遠藤です。
[#37007] [Bug:1.9] 1+1+1+...+1 dumps core — "Yusuke ENDOH" <mame@...>
遠藤です。
はじめまして、よしおかと申します。
遠藤です。
こんにちは、なかむら(う)です。
[ruby-dev:36734] 共有化された配列の参照カウンタによる開放
ワナベと申します。
ary_make_shared() で返される配列(長いので仮に共有配列と呼びます)を
どの配列からも参照されなくなったら rb_gc_force_recycle() するパッチを書きました。
共有配列のARY_CAPAはRARRAY_LENを返すようにし、
空いたaux.capa部分に参照カウンタを格納するようにしています。
たとえば以下のようなスクリプトで効果が期待されます。(恣意的な例ですが)
GC::Profiler.enable
a,b=[1,2,3,4], [5,6,7,8]
Thread.new{$stop=sleep 10}
until $stop
a.replace b
b[0] = 1
end
print GC::Profiler.result[/.*\n/]
私の環境ではGC起動回数が約200回→約10回ほどになりました。
今回はlinux(andLinux)でも動作を確認しています。
# [ruby-dev:34355], [ruby-dev:35850] では失礼しました。両方とも直せずじまいです。
Index: array.c
===================================================================
--- array.c (revision 19779)
+++ array.c (working copy)
@@ -107,7 +107,8 @@
} \
} while (0)
-#define ARY_CAPA(ary) (ARY_EMBED_P(ary) ? RARRAY_EMBED_LEN_MAX :
RARRAY(ary)->as.heap.aux.capa)
+#define ARY_CAPA(ary) (ARY_EMBED_P(ary) ? RARRAY_EMBED_LEN_MAX : \
+ ARY_SHARED_ROOT_P(ary) ? RARRAY_LEN(ary) :
RARRAY(ary)->as.heap.aux.capa)
#define ARY_SET_CAPA(ary, n) do { \
assert(!ARY_EMBED_P(ary)); \
assert(!ARY_SHARED_P(ary)); \
@@ -119,8 +120,21 @@
#define ARY_SET_SHARED(ary, value) do { \
assert(!ARY_EMBED_P(ary)); \
assert(ARY_SHARED_P(ary)); \
+ assert(ARY_SHARED_ROOT_P(value)); \
RARRAY(ary)->as.heap.aux.shared = (value); \
} while (0)
+#define RARRAY_SHARED_ROOT_FLAG FL_USER5
+#define ARY_SHARED_ROOT_P(ary) (FL_TEST(ary, RARRAY_SHARED_ROOT_FLAG))
+#define ARY_SHARED_NUM(ary) \
+ (assert(ARY_SHARED_ROOT_P(ary)), RARRAY(ary)->as.heap.aux.capa)
+#define ARY_SET_SHARED_NUM(ary, value) do { \
+ assert(ARY_SHARED_ROOT_P(ary)); \
+ RARRAY(ary)->as.heap.aux.capa = (value); \
+} while (0)
+#define FL_SET_SHARED_ROOT(ary) do { \
+ assert(!ARY_EMBED_P(ary)); \
+ FL_SET(ary, RARRAY_SHARED_ROOT_FLAG); \
+} while (0)
static void
RESIZE_CAPA(VALUE ary, long capacity)
@@ -153,7 +167,48 @@
}
}
+static void
+rb_ary_decrement_share(VALUE shared)
+{
+ if (shared) {
+ int num = ARY_SHARED_NUM(shared) - 1;
+ if (num == 0) {
+ rb_ary_free(shared);
+ rb_gc_force_recycle(shared);
+ }
+ else if (num > 0) {
+ ARY_SET_SHARED_NUM(shared, num);
+ }
+ }
+}
+
+static void
+rb_ary_unshare(VALUE ary)
+{
+ VALUE shared = RARRAY(ary)->as.heap.aux.shared;
+ rb_ary_decrement_share(shared);
+ FL_UNSET_SHARED(ary);
+}
+
static inline void
+rb_ary_unshare_safe(VALUE ary) {
+ if (ARY_SHARED_P(ary) && !ARY_EMBED_P(ary)) {
+ rb_ary_unshare(ary);
+ }
+}
+
+static void
+rb_ary_set_shared(VALUE ary, VALUE shared)
+{
+ int num = ARY_SHARED_NUM(shared);
+ if (num >= 0) {
+ ARY_SET_SHARED_NUM(shared, num + 1);
+ }
+ FL_SET_SHARED(ary);
+ ARY_SET_SHARED(ary, shared);
+}
+
+static inline void
rb_ary_modify_check(VALUE ary)
{
if (OBJ_FROZEN(ary)) rb_error_frozen("array");
@@ -169,16 +224,18 @@
long len = RARRAY_LEN(ary);
if (len <= RARRAY_EMBED_LEN_MAX) {
VALUE *ptr = ARY_HEAP_PTR(ary);
+ VALUE shared = ARY_SHARED(ary);
FL_UNSET_SHARED(ary);
FL_SET_EMBED(ary);
MEMCPY(ARY_EMBED_PTR(ary), ptr, VALUE, len);
+ rb_ary_decrement_share(shared);
ARY_SET_EMBED_LEN(ary, len);
}
else {
VALUE *ptr = ALLOC_N(VALUE, len);
- FL_UNSET_SHARED(ary);
+ MEMCPY(ptr, RARRAY_PTR(ary), VALUE, len);
+ rb_ary_unshare(ary);
ARY_SET_CAPA(ary, len);
- MEMCPY(ptr, RARRAY_PTR(ary), VALUE, len);
ARY_SET_PTR(ary, ptr);
}
}
@@ -314,7 +371,8 @@
ARY_SET_LEN((VALUE)shared, RARRAY_LEN(ary));
ARY_SET_PTR((VALUE)shared, RARRAY_PTR(ary));
- ARY_SET_CAPA((VALUE)shared, ARY_CAPA(ary));
+ FL_SET_SHARED_ROOT(shared);
+ ARY_SET_SHARED_NUM((VALUE)shared, 1);
FL_SET_SHARED(ary);
ARY_SET_SHARED(ary, (VALUE)shared);
OBJ_FREEZE(shared);
@@ -430,7 +488,7 @@
if (ARY_OWNS_HEAP_P(ary) && RARRAY_PTR(ary)) {
xfree(RARRAY_PTR(ary));
}
- FL_UNSET_SHARED(ary);
+ rb_ary_unshare_safe(ary);
FL_SET_EMBED(ary);
ARY_SET_EMBED_LEN(ary, 0);
if (rb_block_given_p()) {
@@ -550,8 +608,7 @@
shared = ary_make_shared(ary);
ARY_SET_PTR(result, RARRAY_PTR(ary));
ARY_SET_LEN(result, RARRAY_LEN(ary));
- FL_SET_SHARED(result);
- ARY_SET_SHARED(result, shared);
+ rb_ary_set_shared(result, shared);
ARY_INCREASE_PTR(result, offset);
ARY_SET_LEN(result, len);
@@ -1700,7 +1757,7 @@
if (RARRAY_PTR(ary) != RARRAY_PTR(tmp)) {
assert(!ARY_SHARED_P(tmp));
if (ARY_SHARED_P(ary)) {
- FL_UNSET_SHARED(ary);
+ rb_ary_unshare(ary);
}
else {
xfree(ARY_HEAP_PTR(ary));
@@ -2246,23 +2303,34 @@
if (RARRAY_LEN(orig) <= RARRAY_EMBED_LEN_MAX) {
VALUE *ptr;
- if (ARY_OWNS_HEAP_P(copy)) xfree(RARRAY_PTR(copy));
- FL_UNSET_SHARED(copy);
+ VALUE shared = 0;
+
+ if (ARY_OWNS_HEAP_P(copy)) {
+ xfree(RARRAY_PTR(copy));
+ }
+ else if (ARY_SHARED_P(copy)) {
+ shared = ARY_SHARED(copy);
+ FL_UNSET_SHARED(copy);
+ }
FL_SET_EMBED(copy);
ptr = RARRAY_PTR(orig);
MEMCPY(RARRAY_PTR(copy), ptr, VALUE, RARRAY_LEN(orig));
+ if (shared) {
+ rb_ary_decrement_share(shared);
+ }
ARY_SET_LEN(copy, RARRAY_LEN(orig));
}
else {
VALUE shared = ary_make_shared(orig);
if (ARY_OWNS_HEAP_P(copy)) {
xfree(RARRAY_PTR(copy));
+ } else {
+ rb_ary_unshare_safe(copy);
}
FL_UNSET_EMBED(copy);
- FL_SET_SHARED(copy);
ARY_SET_PTR(copy, RARRAY_PTR(orig));
ARY_SET_LEN(copy, RARRAY_LEN(orig));
- ARY_SET_SHARED(copy, shared);
+ rb_ary_set_shared(copy, shared);
}
return copy;
}
--
ワナベ