Home > Archives > 2009-05

2009-05

gflags + glogでdeadlock? (2)

どうもgflagsからglogのMutexが呼ばれるのは何かおかしいと思っていたのだが、readelfで確認したところ、シンボルが競合しているようだ。

ソースコードからは競合しても問題無いようにコーディングしたいという意図が見えるが、glogからgflagsのMutexを使用しても問題が起こらないが、gflagsからglogのMutexを使用した場合に問題が起こるようだ。

id:nobu-q先生による解決策はこうですが、adhoc臭が漂いまくり(笑)


--- glog-0.2.1-orig/src/base/mutex.h    2009-01-22 07:17:01.000000000 +0900
+++ glog-0.2.1/src/base/mutex.h 2009-05-13 21:34:36.000000000 +0900
@@ -99,6 +99,8 @@
 # error Need to implement mutex.h for your architecture, or #define NO_THREADS
 #endif

+namespace hoge {
+
 class Mutex {
  public:
   // Create a Mutex that is not held by anybody.  This constructor is
@@ -246,9 +248,13 @@
   void operator=(const WriterMutexLock&);
 };

+};
+using namespace hoge;

でも本質的に解決するためには名前空間作るしか無いと思うのですがいかがでしょう? > shinhせんせい

googleのコードは必ず名前空間を作る雰囲気がしてたんですが、Mutexだけそうなってるのは歴史的事情かなんかなのかな。usingが禁止されてて面倒くさいのとstatic linkを使用しているので、よく使うものだけは例外的にglobalに有ったりするんだろうか。

gflags + glogでdeadlock?

gflagsとglogの組み合わせだと、初期化時にデッドロックするケースが有る模様 @ RHEL5。ソースコードは以下のような感じ。


#include <glog/logging.h>
#include <google/gflags.h>
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
  google::InitGoogleLogging(argv[0]);
  google::InstallFailureSignalHandler();
  google::ParseCommandLineFlags(&argc, &argv, true);
  cout << "hogehoge" << endl;
}

リンクの順番によって、デッドロックしたりしなかったり。


$ g++ test.cpp -lgflags -lglog; ./a.out
hogehoge
$ g++ test.cpp -lglog -lgflags; ./a.out
^C # deadlock occurs

gdbするとこんな感じ。


(gdb) bt
#0  0x007c8402 in __kernel_vsyscall ()
#1  0x00787ceb in pthread_rwlock_wrlock () from /lib/libpthread.so.0
#2  0x00aaed87 in Mutex::Lock () from /opt/sedue/lib/libglog.so.0
#3  0x00aaedc3 in MutexLock::MutexLock () from /opt/sedue/lib/libglog.so.0
#4  0x00bb9034 in google::(anonymous namespace)::FlagRegistry::GlobalRegistry () from /opt/sedue/lib/libgflags.so.0
#5  0x00bbff49 in google::ParseCommandLineFlagsInternal () from /opt/sedue/lib/libgflags.so.0
#6  0x00bc0196 in google::ParseCommandLineFlags () from /opt/sedue/lib/libgflags.so.0
#7  0x080488a3 in main ()

-g付き。


(gdb) bt
#0  0x003fe402 in __kernel_vsyscall ()
#1  0x002d4ceb in pthread_rwlock_wrlock () from /lib/libpthread.so.0
#2  0x00ca0d87 in Mutex::Lock (this=0x44e904) at src/base/mutex.h:171
#3  0x00ca0dc3 in MutexLock (this=0xbfa390cc, mu=0x44e904) at src/base/mutex.h:217
#4  0x00435034 in GlobalRegistry () at src/gflags.cc:675
#5  0x0043bf49 in ParseCommandLineFlagsInternal (argc=0xbfa391d4, argv=0xbfa391d0, remove_flags=true, do_report=true) at src/gflags.cc:1825
#6  0x0043c196 in google::ParseCommandLineFlags (argc=0xbfa391d4, argv=0xbfa391d0, remove_flags=true) at src/gflags.cc:1855
#7  0x0804d9b3 in main (argc=1, argv=Cannot access memory at address 0x84
) at hoge.cpp:111

初期化順序に問題が有る気がするんだけど、ちょっとソース見た感じでは分からなかったので、バグ報告的エントリ。

n日前より古いファイルを消す

  • 2009-05-12 (Tue)
  • Unix
  • hatena button
  • hatena count
  • save this page del.icio.us

バックアップスクリプトを書く時にいつも忘れるのでメモ。


DATE=`date -d '7 days ago' +%y%m%d0000`
echo $DATE
echo >temp.file
touch -t $DATE temp.file
find . ! -newer temp.file -print | xargs rm -f
rm temp.file

findコマンドの-newerを使用しています (お好みで-anewer, -cnewerなど)。

P.S.
chunさんよりzshのextended_globを覚えろとの指令が飛びました。


setopt extended_glob; ls *(^m-7) -ld

おー。

P.S.2
Higeponさんから以下のようなfindの使い方を教えて頂きました。find高機能すぎ。


find /tmp/ -name "sess_*" -mtime +7 -delete

イーモバイルとニンテンドーWifi USBコネクタでWiiをネットに接続する方法

僕は固定費削減のためにE-Mobile(イーモバイル D01NE)で全てのネット接続を行っています。家にネット回線を引いていません。

が、このたびWii, DSからもネットにつなぎたくなったので、Nintendo Wifi USB Connectorを買ってみました。これを使用すると、ネット回線に繋がったPCを使用してWii/DSをネットに接続する事が出来ます。


アマゾン

楽天

PCにはイーモバイルを指してインターネットに接続し、また同時にWifi USBコネクタを指すことで、Wii/DSがイーモバイルの回線を使用してインターネットに接続出来るようになります。以下の図で言うと、「インターネット接続環境」の部分にイーモバイルを使用します。

さらに詳しくは公式ホームページなどを参考にしてください。

手元のPCでは、使うのに少しはまったので手順をメモします。

Continue reading

Home > Archives > 2009-05

お薦め本
広告
Archives
Categories

Return to page top