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がならないわけでは無いですが試してません。

今更CppUnit

今更ながらにCppUnitに手を出してみました。

感想:

  • CPPUNIT_ASSERT_EQUAL が型変換してくれないのでウザい。
    • 何のためのマクロやねんと。
  • CPPUNIT_ASSERT_NOT_EQUAL がない。
    • 結構致命的な気がするんだけどどうだろう?

googletestに行ってみます(`・ω・´)ヾ

Ruby-1.9でutility_belt そのにっ

gem にしました。

さて、gemcutterに登録するにはどうするんだろう(´・ω・`)


※追記

登録できました\(゚∀゚)/

$ gem search utility_belt_r19 -r

*** REMOTE GEMS ***

utility_belt_r19 (0.0.1)