ap4rプロセスが停止しない件について
ap4rプロセスが停止してくれない時があるのですが、原因は多分これですね。
http://redmine.ruby-lang.org/issues/show/3674
以下、ruby-1.8.6-p420向けのパッチ。上記記事(Ruby1.9向け)の再編です。
--- lib/drb/drb-p420.rb 2010-11-01 15:09:36.138190005 +0900 +++ lib/drb/drb.rb 2010-11-01 15:11:08.288190009 +0900 @@ -1416,8 +1416,14 @@ grp.add(Thread.current) list = @grp.list while list.size > 0 + list = list.map do |th| + th.kill if th.alive? + end.compact list.each do |th| - th.kill if th.alive? + begin + th.join + rescue Exception + end end list = @grp.list end
Ruby-1.8.6系のSIGVTALRMバグ
1.8.7系では修正されているのですが、1.8.6系ではp420を含めてバックポートされていないようです。
こんなの
Virtual timer expired
以下は1.8.7系での修正を1.8.6系へ移植したものです。
diff -Naur ruby-1.8.6-p420//eval.c ruby-1.8.6-p420-SIGVTALRM//eval.c --- ruby-1.8.6-p420//eval.c 2010-06-22 05:32:00.000000000 +0900 +++ ruby-1.8.6-p420-SIGVTALRM//eval.c 2010-10-26 10:48:20.658203999 +0900 @@ -11953,6 +11953,12 @@ static int thread_init; +#if defined(POSIX_SIGNAL) +#define CATCH_VTALRM() posix_signal(SIGVTALRM, catch_timer) +#else +#define CATCH_VTALRM() signal(SIGVTALRM, catch_timer) +#endif + #if defined(_THREAD_SAFE) static void catch_timer(sig) @@ -12036,6 +12042,8 @@ static pthread_cond_t start = PTHREAD_COND_INITIALIZER; if (!thread_init) return; + if (rb_thread_alone()) return; + CATCH_VTALRM(); args[0] = &time_thread; args[1] = &start; safe_mutex_lock(&time_thread.lock); @@ -12078,6 +12086,8 @@ struct itimerval tval; if (thread_init) return; + if (rb_thread_alone()) return; + CATCH_VTALRM(); tval.it_interval.tv_sec = 0; tval.it_interval.tv_usec = 10000; tval.it_value = tval.it_interval; @@ -12117,17 +12127,11 @@ "can't start a new thread (frozen ThreadGroup)"); } - if (!thread_init) { #if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE) -#if defined(POSIX_SIGNAL) - posix_signal(SIGVTALRM, catch_timer); -#else - signal(SIGVTALRM, catch_timer); -#endif - + if (!thread_init) { rb_thread_start_timer(); -#endif } +#endif if (THREAD_SAVE_CONTEXT(curr_thread)) { return thread; @@ -12876,6 +12880,9 @@ main_thread = curr_thread; curr_thread->next = curr_thread; curr_thread->prev = curr_thread; +#if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE) + rb_thread_stop_timer(); +#endif }
バージョンコードが同じだと色々困るので、version.h にも手をいれて使っています。
diff -Naur ruby-1.8.6-p420//version.h ruby-1.8.6-p420-SIGVTALRM//version.h --- ruby-1.8.6-p420//version.h 2010-09-02 00:14:52.000000000 +0900 +++ ruby-1.8.6-p420-SIGVTALRM//version.h 2010-10-26 10:53:51.608203999 +0900 @@ -1,7 +1,7 @@ #define RUBY_VERSION "1.8.6" -#define RUBY_RELEASE_DATE "2010-09-02" +#define RUBY_RELEASE_DATE "2010-10-26" #define RUBY_VERSION_CODE 186 -#define RUBY_RELEASE_CODE 20100902 +#define RUBY_RELEASE_CODE 20101026 #define RUBY_PATCHLEVEL 420 #define RUBY_VERSION_MAJOR 1
Ubuntu 10.10/amd64 + VMWareWorkstation 7.1.2 でモジュールビルド失敗 その2
vmmon-onlyに続いてvsock-onlyもダメ。
CC [M] /tmp/vmware-root/modules/vsock-only/linux/af_vsock.o /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c: In function ‘VSockVmciStreamConnect’: /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3233: error: ‘struct sock’ has no member named ‘sk_sleep’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3256: error: ‘struct sock’ has no member named ‘sk_sleep’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3268: error: ‘struct sock’ has no member named ‘sk_sleep’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c: In function ‘VSockVmciAccept’: /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3328: error: ‘struct sock’ has no member named ‘sk_sleep’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3344: error: ‘struct sock’ has no member named ‘sk_sleep’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3378: error: ‘struct sock’ has no member named ‘sk_sleep’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c: In function ‘VSockVmciPoll’: /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3476: error: ‘struct sock’ has no member named ‘sk_sleep’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c: In function ‘VSockVmciStreamSendmsg’: /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:4116: error: ‘struct sock’ has no member named ‘sk_sleep’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:4153: error: ‘struct sock’ has no member named ‘sk_sleep’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:4206: error: ‘struct sock’ has no member named ‘sk_sleep’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c: In function ‘VSockVmciStreamRecvmsg’: /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:4440: error: ‘struct sock’ has no member named ‘sk_sleep’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:4480: error: ‘struct sock’ has no member named ‘sk_sleep’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:4546: error: ‘struct sock’ has no member named ‘sk_sleep’ make[2]: *** [/tmp/vmware-root/modules/vsock-only/linux/af_vsock.o] エラー 1 make[1]: *** [_module_/tmp/vmware-root/modules/vsock-only] エラー 2 make[1]: ディレクトリ `/usr/src/linux-headers-2.6.35-22-generic' から出ます make: *** [vsock.ko] エラー 2 make: ディレクトリ `/tmp/vmware-root/modules/vsock-only' から出ます
http://mib.pianetalinux.org/mib/forum/viewtopic.php?f=6&t=2369&p=13397
の記事にパッチがあるので先日の手順を参考にして(~/Downloads/vsock.patch に上記記事のパッチがあるとして)
cd /tmp tar xvf /usr/lib/vmware/modules/source/vsock.tar -C /tmp patch < ~/Downloads/vsock.patch tar cvf /usr/lib/vmware/modules/source/vsock.tar vsock-only
でOK.
Ubuntu 10.10/amd64 + VMWareWorkstation 7.1.2 でモジュールビルド失敗
はい。どうやらお約束のようです。
CC [M] /tmp/vmware-root/modules/vmmon-only/linux/iommu.o /tmp/vmware-root/modules/vmmon-only/linux/iommu.c: In function ‘IOMMU_SetupMMU’: /tmp/vmware-root/modules/vmmon-only/linux/iommu.c:156: error: implicit declaration of function ‘iommu_map_range’ /tmp/vmware-root/modules/vmmon-only/linux/iommu.c: In function ‘IOMMU_VMCleanup’: /tmp/vmware-root/modules/vmmon-only/linux/iommu.c:403: error: implicit declaration of function ‘iommu_unmap_range’ make[2]: *** [/tmp/vmware-root/modules/vmmon-only/linux/iommu.o] エラー 1 make[1]: *** [_module_/tmp/vmware-root/modules/vmmon-only] エラー 2 make[1]: ディレクトリ `/usr/src/linux-headers-2.6.35-22-generic' から出ます make: *** [vmmon.ko] エラー 2 make: ディレクトリ `/tmp/vmware-root/modules/vmmon-only' から出ます
reid.ai: VMware vmmon compilation issues on 64-bit kernel 2.6.35
ここの手順でパッチをあててインストールできました。
今度はgoogletest
CppUnitがアレだったのでgoogletest。
感想:
- ちゃんと型変換してくれる。
- EXPECT_NE(ASSERT_NE)がある。
- CppUnitの半分のステップ数で同じテストが書けた。
- 1class/2methods/8assertsのとき。
よさげなので mtrace も埋め込んでみました。正しく「No memory leaks.」になります。CppTestがならないわけでは無いですが試してません。
Ruby-1.9でutility_belt そのにっ
gem にしました。
- http://github.com/suzumura-ss/utility_belt_r19
- http://github.com/suzumura-ss/utility_belt_r19/blob/master/pkg/utility_belt_r19-0.0.1.gem
さて、gemcutterに登録するにはどうするんだろう(´・ω・`)
※追記
登録できました\(゚∀゚)/
$ gem search utility_belt_r19 -r *** REMOTE GEMS *** utility_belt_r19 (0.0.1)