しょんぼり技術メモ

まいにちがしょんぼり

V-Fieldを使ってみたい

読み取り専用の分散多重化共有ブロックデバイス、V-FIELD(http://viver.sourceforge.jp/index.php?Scrapbook/V-FIELD)を使ってみようとした。

環境

Fedora12, x86_64, V-FIELD changeset 69

下準備

レポジトリへのアクセスにmercurialコンパイルにimake, boostが必要なのでインストーる。

# yum install mercurial imake boost boost-devel

レポジトリからソースコードを取得

$ mkdir /usr/src/vfield
$ cd /usr/src/vfield
$ hg clone http://viver.sourceforge.jp/cgi-bin/repos/vfield.cgi
destination directory: vfield.cgi
requesting all changes
adding changesets
adding manifests
adding file changes
added 70 changesets with 815 changes to 121 files
updating to branch default
68 files updated, 0 files merged, 0 files removed, 0 files unresolved

vfield.cgiディレクトリ以下にコピーされる。

boostの変更に追従

boost/thread.hppをincludeするのではなく、boost/thread/condition.hppをincludeする必要があるらしい。

影響のあるファイルは

$ grep -R 'boost::condition' *
common/locked_queue.h:  boost::condition m_cond;
common/rw_lock.h:       boost::condition m_final;
common/notify.h:        boost::condition cond;
common/threadpool.h:    boost::condition ring_cond;
search/engine.cc:       boost::condition m_condition;
stream/stream.cc:       boost::condition m_sweep_thread_cond;

この6ファイルらしい。これらにincludeを追加する。

また、boost_threadがマルチスレッド用にboost_thread-mtと名前が変わっているので、あわせてRules.mkも変更する。

次のパッチファイルを使って一括更新する。

diff -Nur --exclude=Makefile --exclude=Makefile.bak --exclude=.hg vfield.cgi/Rules.mk vfield.cgi.new/Rules.mk
--- vfield.cgi/Rules.mk 2010-05-31 00:06:30.888090400 +0900
+++ vfield.cgi.new/Rules.mk     2010-05-31 00:57:27.121144254 +0900
@@ -1,5 +1,5 @@
 CXX ?= c++
-OPTIMIZE = -O5 -mtune=pentium4
+OPTIMIZE =
 RELEASE = $(OPTIMIZE) -DNDEBUG
 QUIET   = $(OPTIMIZE) -DQUIET
 QUIET0  = $(OPTIMIZE) -DQUIET0
@@ -7,7 +7,7 @@
 #CFLAGS += -Wall -g -pipe -I$(build_dir) -I$(build_dir)/common -D_FILE_OFFSET_BITS=64 $(RELEASE)
 CFLAGS += -Wall -pipe -I$(build_dir) -I$(build_dir)/common -D_FILE_OFFSET_BITS=64 $(RELEASE)
 #LDFLAGS += -lpthread -Wl,-Bstatic -lboost_thread -Wl,-Bdynamic -lrt
-LDFLAGS += -static -lboost_thread -lpthread -lrt
+LDFLAGS += -Bstatic -lboost_thread-mt -lpthread -lrt


 .SUFFIXES: .cc .o .h .h.gch .exe
diff -Nur --exclude=Makefile --exclude=Makefile.bak --exclude=.hg vfield.cgi/common/locked_queue.h vfield.cgi.new/common/locked_queue.h
--- vfield.cgi/common/locked_queue.h    2010-05-31 00:06:30.903091653 +0900
+++ vfield.cgi.new/common/locked_queue.h        2010-05-31 00:05:51.113101332 +0900
@@ -5,6 +5,7 @@
 #include <queue>
 #include <boost/shared_ptr.hpp>
 #include <boost/thread.hpp>
+#include <boost/thread/condition.hpp>

 // XXX: 例外処理が無い

diff -Nur --exclude=Makefile --exclude=Makefile.bak --exclude=.hg vfield.cgi/common/notify.h vfield.cgi.new/common/notify.h
--- vfield.cgi/common/notify.h  2010-05-31 00:06:30.906093691 +0900
+++ vfield.cgi.new/common/notify.h      2010-05-31 00:05:44.132098662 +0900
@@ -4,6 +4,7 @@
 #include <boost/shared_ptr.hpp>
 #include <boost/optional.hpp>
 #include <boost/thread.hpp>
+#include <boost/thread/condition.hpp>
 //#include <boost/bind.hpp>
 //#include <functional>

diff -Nur --exclude=Makefile --exclude=Makefile.bak --exclude=.hg vfield.cgi/common/rw_lock.h vfield.cgi.new/common/rw_lock.h
--- vfield.cgi/common/rw_lock.h 2010-05-31 00:06:30.907093439 +0900
+++ vfield.cgi.new/common/rw_lock.h     2010-05-31 00:05:47.598124341 +0900
@@ -2,6 +2,7 @@
 #define VFIELD_RW_LOCK_H__

 #include <boost/thread.hpp>
+#include <boost/thread/condition.hpp>
 #include <boost/utility.hpp>

 namespace VFIELD {
diff -Nur --exclude=Makefile --exclude=Makefile.bak --exclude=.hg vfield.cgi/common/threadpool.h vfield.cgi.new/common/threadpool.h
--- vfield.cgi/common/threadpool.h      2010-05-31 00:06:30.909090980 +0900
+++ vfield.cgi.new/common/threadpool.h  2010-05-31 00:05:39.931339695 +0900
@@ -6,6 +6,7 @@
 #include <boost/ptr_container/ptr_vector.hpp>
 #include <boost/ptr_container/ptr_deque.hpp>
 #include <boost/thread.hpp>
+#include <boost/thread/condition.hpp>
 #include <boost/function.hpp>
 #include <boost/bind.hpp>      // 使う側で便利用

diff -Nur --exclude=Makefile --exclude=Makefile.bak --exclude=.hg vfield.cgi/search/engine.cc vfield.cgi.new/search/engine.cc
--- vfield.cgi/search/engine.cc 2010-05-31 00:06:30.931102485 +0900
+++ vfield.cgi.new/search/engine.cc     2010-05-31 00:05:34.131130781 +0900
@@ -16,6 +16,7 @@
 #include <functional>
 #include <boost/bind.hpp>
 #include <boost/ptr_container/ptr_vector.hpp>
+#include <boost/thread/condition.hpp>

 namespace VFIELD {

diff -Nur --exclude=Makefile --exclude=Makefile.bak --exclude=.hg vfield.cgi/stream/stream.cc vfield.cgi.new/stream/stream.cc
--- vfield.cgi/stream/stream.cc 2010-05-31 00:06:30.942272674 +0900
+++ vfield.cgi.new/stream/stream.cc     2010-05-31 00:05:19.169104287 +0900
@@ -14,6 +14,7 @@
 #include <deque>
 #include <algorithm>
 #include <boost/thread.hpp>
+#include <boost/thread/condition.hpp>
 #include <boost/bind.hpp>
 #include <boost/shared_array.hpp>
 #include <boost/scoped_ptr.hpp>

こんなファイルを、vfield.cgi と同じディレクトリに、cond-boost_thread.patch として作成し、次のようにして適用する。

$ patch -p0 < cond-boost_thread.patch
patching file vfield.cgi/Rules.mk
patching file vfield.cgi/common/locked_queue.h
patching file vfield.cgi/common/notify.h
patching file vfield.cgi/common/rw_lock.h
patching file vfield.cgi/common/threadpool.h
patching file vfield.cgi/search/engine.cc
patching file vfield.cgi/stream/stream.cc

makeする

$ make depend

大量のwarningが出てもとりあえず気にしない。

$ make

が通れば(どうやら)OK。


予想以上に手間取ったので今日はここまで。。。