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
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。
予想以上に手間取ったので今日はここまで。。。