diff -Nru leveldb-0+20111031.git36a5f8e/build_detect_platform leveldb-0+20120125.git3c8be10/build_detect_platform --- leveldb-0+20111031.git36a5f8e/build_detect_platform 2011-11-08 13:50:06.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/build_detect_platform 2012-02-02 12:20:22.000000000 +0000 @@ -13,6 +13,10 @@ # Delete existing build_config.mk rm -f build_config.mk +if test -z "$CXX"; then + CXX=g++ +fi + # Detect OS case `uname -s` in Darwin) @@ -48,8 +52,8 @@ # Detect C++0x -- this determines whether we'll use port_noatomic.h # or port_posix.h by: # 1. Rrying to compile with -std=c++0x and including . -# 2. If g++ returns error code, we know to use port_posix.h -g++ $CFLAGS -std=c++0x -x c++ - -o /dev/null 2>/dev/null </dev/null < int main() {} EOF @@ -61,7 +65,7 @@ # Test whether Snappy library is installed # http://code.google.com/p/snappy/ -g++ $CFLAGS -x c++ - -o /dev/null 2>/dev/null </dev/null < int main() {} EOF diff -Nru leveldb-0+20111031.git36a5f8e/db/dbformat.cc leveldb-0+20120125.git3c8be10/db/dbformat.cc --- leveldb-0+20111031.git36a5f8e/db/dbformat.cc 2011-11-08 13:50:06.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/db/dbformat.cc 2012-02-02 12:20:22.000000000 +0000 @@ -73,9 +73,10 @@ Slice user_limit = ExtractUserKey(limit); std::string tmp(user_start.data(), user_start.size()); user_comparator_->FindShortestSeparator(&tmp, user_limit); - if (user_comparator_->Compare(*start, tmp) < 0) { - // User key has become larger. Tack on the earliest possible - // number to the shortened user key. + if (tmp.size() < user_start.size() && + user_comparator_->Compare(user_start, tmp) < 0) { + // User key has become shorter physically, but larger logically. + // Tack on the earliest possible number to the shortened user key. PutFixed64(&tmp, PackSequenceAndType(kMaxSequenceNumber,kValueTypeForSeek)); assert(this->Compare(*start, tmp) < 0); assert(this->Compare(tmp, limit) < 0); @@ -87,9 +88,10 @@ Slice user_key = ExtractUserKey(*key); std::string tmp(user_key.data(), user_key.size()); user_comparator_->FindShortSuccessor(&tmp); - if (user_comparator_->Compare(user_key, tmp) < 0) { - // User key has become larger. Tack on the earliest possible - // number to the shortened user key. + if (tmp.size() < user_key.size() && + user_comparator_->Compare(user_key, tmp) < 0) { + // User key has become shorter physically, but larger logically. + // Tack on the earliest possible number to the shortened user key. PutFixed64(&tmp, PackSequenceAndType(kMaxSequenceNumber,kValueTypeForSeek)); assert(this->Compare(*key, tmp) < 0); key->swap(tmp); diff -Nru leveldb-0+20111031.git36a5f8e/db/db_impl.cc leveldb-0+20120125.git3c8be10/db/db_impl.cc --- leveldb-0+20111031.git36a5f8e/db/db_impl.cc 2011-11-08 13:50:06.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/db/db_impl.cc 2012-02-02 12:20:22.000000000 +0000 @@ -655,6 +655,8 @@ CompactionState* compact = new CompactionState(c); status = DoCompactionWork(compact); CleanupCompaction(compact); + c->ReleaseInputs(); + DeleteObsoleteFiles(); } delete c; @@ -672,6 +674,9 @@ if (is_manual) { ManualCompaction* m = manual_compaction_; + if (!status.ok()) { + m->done = true; + } if (!m->done) { // We only compacted part of the requested range. Update *m // to the range that is left to be compacted. @@ -793,21 +798,8 @@ compact->compaction->edit()->AddFile( level + 1, out.number, out.file_size, out.smallest, out.largest); - pending_outputs_.erase(out.number); - } - compact->outputs.clear(); - - Status s = versions_->LogAndApply(compact->compaction->edit(), &mutex_); - if (s.ok()) { - compact->compaction->ReleaseInputs(); - DeleteObsoleteFiles(); - } else { - // Discard any files we may have created during this failed compaction - for (size_t i = 0; i < compact->outputs.size(); i++) { - env_->DeleteFile(TableFileName(dbname_, compact->outputs[i].number)); - } } - return s; + return versions_->LogAndApply(compact->compaction->edit(), &mutex_); } Status DBImpl::DoCompactionWork(CompactionState* compact) { diff -Nru leveldb-0+20111031.git36a5f8e/db/db_test.cc leveldb-0+20120125.git3c8be10/db/db_test.cc --- leveldb-0+20111031.git36a5f8e/db/db_test.cc 2011-11-08 13:50:06.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/db/db_test.cc 2012-02-02 12:20:22.000000000 +0000 @@ -28,8 +28,12 @@ // sstable Sync() calls are blocked while this pointer is non-NULL. port::AtomicPointer delay_sstable_sync_; + // Simulate no-space errors while this pointer is non-NULL. + port::AtomicPointer no_space_; + explicit SpecialEnv(Env* base) : EnvWrapper(base) { delay_sstable_sync_.Release_Store(NULL); + no_space_.Release_Store(NULL); } Status NewWritableFile(const std::string& f, WritableFile** r) { @@ -44,7 +48,14 @@ base_(base) { } ~SSTableFile() { delete base_; } - Status Append(const Slice& data) { return base_->Append(data); } + Status Append(const Slice& data) { + if (env_->no_space_.Acquire_Load() != NULL) { + // Drop writes on the floor + return Status::OK(); + } else { + return base_->Append(data); + } + } Status Close() { return base_->Close(); } Status Flush() { return base_->Flush(); } Status Sync() { @@ -239,6 +250,12 @@ return result; } + int CountFiles() { + std::vector files; + env_->GetChildren(dbname_, &files); + return static_cast(files.size()); + } + uint64_t Size(const Slice& start, const Slice& limit) { Range r(start, limit); uint64_t size; @@ -1146,26 +1163,50 @@ public: virtual const char* Name() const { return "test.NumberComparator"; } virtual int Compare(const Slice& a, const Slice& b) const { - return (strtol(a.ToString().c_str(), NULL, 0) - - strtol(b.ToString().c_str(), NULL, 0)); + return ToNumber(a) - ToNumber(b); + } + virtual void FindShortestSeparator(std::string* s, const Slice& l) const { + ToNumber(*s); // Check format + ToNumber(l); // Check format + } + virtual void FindShortSuccessor(std::string* key) const { + ToNumber(*key); // Check format + } + private: + static int ToNumber(const Slice& x) { + // Check that there are no extra characters. + ASSERT_TRUE(x.size() >= 2 && x[0] == '[' && x[x.size()-1] == ']') + << EscapeString(x); + int val; + char ignored; + ASSERT_TRUE(sscanf(x.ToString().c_str(), "[%i]%c", &val, &ignored) == 1) + << EscapeString(x); + return val; } - virtual void FindShortestSeparator(std::string* s, const Slice& l) const {} - virtual void FindShortSuccessor(std::string* key) const {} }; NumberComparator cmp; Options new_options; new_options.create_if_missing = true; new_options.comparator = &cmp; + new_options.write_buffer_size = 1000; // Compact more often DestroyAndReopen(&new_options); - ASSERT_OK(Put("10", "ten")); - ASSERT_OK(Put("0x14", "twenty")); + ASSERT_OK(Put("[10]", "ten")); + ASSERT_OK(Put("[0x14]", "twenty")); for (int i = 0; i < 2; i++) { - ASSERT_EQ("ten", Get("10")); - ASSERT_EQ("ten", Get("0xa")); - ASSERT_EQ("twenty", Get("20")); - ASSERT_EQ("twenty", Get("0x14")); - Compact("0", "9999"); - fprintf(stderr, "ss\n%s\n", DumpSSTableList().c_str()); + ASSERT_EQ("ten", Get("[10]")); + ASSERT_EQ("ten", Get("[0xa]")); + ASSERT_EQ("twenty", Get("[20]")); + ASSERT_EQ("twenty", Get("[0x14]")); + Compact("[0]", "[9999]"); + } + + for (int run = 0; run < 2; run++) { + for (int i = 0; i < 1000; i++) { + char buf[100]; + snprintf(buf, sizeof(buf), "[%d]", i*10); + ASSERT_OK(Put(buf, buf)); + } + Compact("[0]", "[1000000]"); } } @@ -1242,6 +1283,37 @@ db = NULL; } +// Check that number of files does not grow when we are out of space +TEST(DBTest, NoSpace) { + Options options; + options.env = env_; + Reopen(&options); + + ASSERT_OK(Put("foo", "v1")); + ASSERT_EQ("v1", Get("foo")); + Compact("a", "z"); + const int num_files = CountFiles(); + env_->no_space_.Release_Store(env_); // Force out-of-space errors + for (int i = 0; i < 10; i++) { + for (int level = 0; level < config::kNumLevels-1; level++) { + dbfull()->TEST_CompactRange(level, NULL, NULL); + } + } + env_->no_space_.Release_Store(NULL); + ASSERT_LT(CountFiles(), num_files + 5); +} + +TEST(DBTest, FilesDeletedAfterCompaction) { + ASSERT_OK(Put("foo", "v2")); + Compact("a", "z"); + const int num_files = CountFiles(); + for (int i = 0; i < 10; i++) { + ASSERT_OK(Put("foo", "v2")); + Compact("a", "z"); + } + ASSERT_EQ(CountFiles(), num_files); +} + // Multi-threaded test: namespace { @@ -1263,14 +1335,15 @@ static void MTThreadBody(void* arg) { MTThread* t = reinterpret_cast(arg); + int id = t->id; DB* db = t->state->test->db_; uintptr_t counter = 0; - fprintf(stderr, "... starting thread %d\n", t->id); - Random rnd(1000 + t->id); + fprintf(stderr, "... starting thread %d\n", id); + Random rnd(1000 + id); std::string value; char valbuf[1500]; while (t->state->stop.Acquire_Load() == NULL) { - t->state->counter[t->id].Release_Store(reinterpret_cast(counter)); + t->state->counter[id].Release_Store(reinterpret_cast(counter)); int key = rnd.Uniform(kNumKeys); char keybuf[20]; @@ -1280,7 +1353,7 @@ // Write values of the form . // We add some padding for force compactions. snprintf(valbuf, sizeof(valbuf), "%d.%d.%-1000d", - key, t->id, static_cast(counter)); + key, id, static_cast(counter)); ASSERT_OK(db->Put(WriteOptions(), Slice(keybuf), Slice(valbuf))); } else { // Read a value and verify that it matches the pattern written above. @@ -1301,8 +1374,8 @@ } counter++; } - t->state->thread_done[t->id].Release_Store(t); - fprintf(stderr, "... stopping thread %d after %d ops\n", t->id, int(counter)); + t->state->thread_done[id].Release_Store(t); + fprintf(stderr, "... stopping thread %d after %d ops\n", id, int(counter)); } } // namespace diff -Nru leveldb-0+20111031.git36a5f8e/db/filename.cc leveldb-0+20120125.git3c8be10/db/filename.cc --- leveldb-0+20111031.git36a5f8e/db/filename.cc 2011-11-08 13:50:06.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/db/filename.cc 2012-02-02 12:20:22.000000000 +0000 @@ -11,6 +11,10 @@ namespace leveldb { +// A utility routine: write "data" to the named file and Sync() it. +extern Status WriteStringToFileSync(Env* env, const Slice& data, + const std::string& fname); + static std::string MakeFileName(const std::string& name, uint64_t number, const char* suffix) { char buf[100]; @@ -122,7 +126,7 @@ assert(contents.starts_with(dbname + "/")); contents.remove_prefix(dbname.size() + 1); std::string tmp = TempFileName(dbname, descriptor_number); - Status s = WriteStringToFile(env, contents.ToString() + "\n", tmp); + Status s = WriteStringToFileSync(env, contents.ToString() + "\n", tmp); if (s.ok()) { s = env->RenameFile(tmp, CurrentFileName(dbname)); } diff -Nru leveldb-0+20111031.git36a5f8e/debian/changelog leveldb-0+20120125.git3c8be10/debian/changelog --- leveldb-0+20111031.git36a5f8e/debian/changelog 2011-11-30 11:06:49.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/debian/changelog 2012-02-02 12:21:18.000000000 +0000 @@ -1,3 +1,22 @@ +leveldb (0+20120125.git3c8be10-1) unstable; urgency=low + + * New upstream snapshot. + * Build with snappy. (Closes: #654291) + + -- Alessio Treglia Thu, 02 Feb 2012 13:21:01 +0100 + +leveldb (0+20111130.gitc8c5866-1) unstable; urgency=low + + [ Alessio Treglia ] + * New upstream snapshot. + * Refresh patches. + * debian/rules: Support "noopt" flag. + + [ Pino Toscano ] + * Add preliminary support for GNU/Hurd. + + -- Alessio Treglia Mon, 02 Jan 2012 09:44:04 +0100 + leveldb (0+20111031.git36a5f8e-2) unstable; urgency=low * Fix build failure with --as-needed flag enabled (Closes: #647105). diff -Nru leveldb-0+20111031.git36a5f8e/debian/control leveldb-0+20120125.git3c8be10/debian/control --- leveldb-0+20111031.git36a5f8e/debian/control 2011-11-08 13:49:07.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/debian/control 2012-01-12 12:15:07.000000000 +0000 @@ -2,7 +2,8 @@ Section: database Priority: optional Maintainer: Alessio Treglia -Build-Depends: debhelper (>= 7.0.50~) +Build-Depends: debhelper (>= 7.0.50~), + libsnappy-dev Standards-Version: 3.9.2 Homepage: http://code.google.com/p/leveldb/ Vcs-Git: git://git.debian.org/collab-maint/leveldb.git diff -Nru leveldb-0+20111031.git36a5f8e/debian/patches/0010-shared_object.patch leveldb-0+20120125.git3c8be10/debian/patches/0010-shared_object.patch --- leveldb-0+20111031.git36a5f8e/debian/patches/0010-shared_object.patch 2011-11-08 13:59:09.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/debian/patches/0010-shared_object.patch 2011-12-05 18:07:37.000000000 +0000 @@ -1,55 +1,32 @@ -Description: - Pass system's values of CFLAGS,LDFLAGS. - Don't override OPT if it's already set. - Build the dynamic shared library. +Description: Build the dynamic shared library on Linux only. Author: Alessio Treglia Forwarded: http://code.google.com/p/leveldb/issues/detail?id=27 --- - Makefile | 18 ++++++++++++++---- - 1 file changed, 14 insertions(+), 4 deletions(-) + Makefile | 11 +++++++++++ + build_detect_platform | 4 ++-- + 2 files changed, 13 insertions(+), 2 deletions(-) --- leveldb.orig/Makefile +++ leveldb/Makefile -@@ -3,12 +3,14 @@ - # found in the LICENSE file. See the AUTHORS file for names of contributors. +@@ -5,6 +5,9 @@ + CXX ?= g++ + CC ?= gcc - CC = g++ +SONAME_MAJOR=0 +SONAME_MINOR=0 - ++ #----------------------------------------------- # Uncomment exactly one of the lines labelled (A), (B), and (C) below # to switch between compilation modes. - --OPT = -O2 -DNDEBUG # (A) Production use (optimized mode) -+OPT ?= -O2 -DNDEBUG # (A) Production use (optimized mode) - # OPT = -g2 # (B) Debug mode, w/ full line-level debugging symbols - # OPT = -O2 -g2 -DNDEBUG # (C) Profiling mode: opt, but w/debugging symbols - #----------------------------------------------- -@@ -36,9 +38,9 @@ else - GOOGLE_PERFTOOLS_LDFLAGS= - endif - --CFLAGS = -c -I. -I./include $(PORT_CFLAGS) $(PLATFORM_CFLAGS) $(OPT) $(SNAPPY_CFLAGS) -+CFLAGS += -c -I. -I./include $(PORT_CFLAGS) $(PLATFORM_CFLAGS) $(OPT) $(SNAPPY_CFLAGS) -fPIC - --LDFLAGS=$(PLATFORM_LDFLAGS) $(SNAPPY_LDFLAGS) $(GOOGLE_PERFTOOLS_LDFLAGS) -+LDFLAGS += $(PLATFORM_LDFLAGS) $(SNAPPY_LDFLAGS) $(GOOGLE_PERFTOOLS_LDFLAGS) - - LIBOBJECTS = \ - ./db/builder.o \ -@@ -103,15 +105,17 @@ PROGRAMS = db_bench $(TESTS) +@@ -104,6 +107,7 @@ PROGRAMS = db_bench $(TESTS) BENCHMARKS = db_bench_sqlite3 db_bench_tree_db LIBRARY = libleveldb.a +SHARED_LIBRARY = libleveldb.so MEMENVLIBRARY = libmemenv.a --all: $(LIBRARY) -+all: $(LIBRARY) $(SHARED_LIBRARY) - - check: $(PROGRAMS) $(TESTS) - for t in $(TESTS); do echo "***** Running $$t"; ./$$t || exit 1; done + all: $(LIBRARY) +@@ -113,6 +117,7 @@ check: $(PROGRAMS) $(TESTS) clean: -rm -f $(PROGRAMS) $(BENCHMARKS) $(LIBRARY) $(MEMENVLIBRARY) */*.o */*/*.o ios-x86/*/*.o ios-arm/*/*.o @@ -57,16 +34,36 @@ -rm -rf ios-x86/* ios-arm/* -rm build_config.mk -@@ -119,6 +123,12 @@ $(LIBRARY): $(LIBOBJECTS) +@@ -120,6 +125,12 @@ $(LIBRARY): $(LIBOBJECTS) rm -f $@ $(AR) -rs $@ $(LIBOBJECTS) +$(SHARED_LIBRARY): $(LIBOBJECTS) + rm -f $@ -+ $(CC) -shared -Wl,-soname -Wl,$@.$(SONAME_MAJOR) $(LIBOBJECTS) $(LDFLAGS) -o $@.$(SONAME_MAJOR).$(SONAME_MINOR) ++ $(CXX) $(LDFLAGS) $(CFLAGS) -shared -Wl,-soname -Wl,$@.$(SONAME_MAJOR) $(LIBOBJECTS) -o $@.$(SONAME_MAJOR).$(SONAME_MINOR) + ln -s $@.$(SONAME_MAJOR).$(SONAME_MINOR) $@.$(SONAME_MAJOR) + ln -s $@.$(SONAME_MAJOR).$(SONAME_MINOR) $@ + db_bench: db/db_bench.o $(LIBOBJECTS) $(TESTUTIL) - $(CC) $(LDFLAGS) db/db_bench.o $(LIBOBJECTS) $(TESTUTIL) -o $@ + $(CXX) $(LDFLAGS) db/db_bench.o $(LIBOBJECTS) $(TESTUTIL) -o $@ +--- leveldb.orig/build_detect_platform ++++ leveldb/build_detect_platform +@@ -26,7 +26,7 @@ case `uname -s` in + ;; + Linux) + PLATFORM=OS_LINUX +- echo "PLATFORM_CFLAGS=-pthread -DOS_LINUX" >> build_config.mk ++ echo "PLATFORM_CFLAGS=-pthread -fPIC -DPIC -DOS_LINUX" >> build_config.mk + echo "PLATFORM_LDFLAGS=-lpthread" >> build_config.mk + ;; + SunOS) +@@ -36,7 +36,7 @@ case `uname -s` in + ;; + FreeBSD) + PLATFORM=OS_FREEBSD +- echo "PLATFORM_CFLAGS=-D_REENTRANT -DOS_FREEBSD" >> build_config.mk ++ echo "PLATFORM_CFLAGS=-D_REENTRANT -fPIC -DPIC -DOS_FREEBSD" >> build_config.mk + echo "PLATFORM_LDFLAGS=-lpthread" >> build_config.mk + ;; + *) diff -Nru leveldb-0+20111031.git36a5f8e/debian/patches/0101-as_needed.patch leveldb-0+20120125.git3c8be10/debian/patches/0101-as_needed.patch --- leveldb-0+20111031.git36a5f8e/debian/patches/0101-as_needed.patch 2011-11-29 23:36:20.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/debian/patches/0101-as_needed.patch 2012-01-02 09:32:12.000000000 +0000 @@ -1,11 +1,11 @@ -Description: fix build with --as-needed linker option - Put library flags in LIBS variable rather that LDFLAGS. Add LIBS to makefile - after object files. +Description: Fix build with --as-needed linker option. + Put library flags in LIBS variable rather that LDFLAGS. + Add LIBS to makefile after object files list (for a correct linking order). Author: Ilya Barygin Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=647105 Bug: http://code.google.com/p/leveldb/issues/detail?id=57 Reviewed-by: Alessio Treglia -Last-Update: 2011-11-30 +Last-Update: 2011-12-05 --- Makefile | 50 +++++++++++++++++++++++++------------------------- build_detect_platform | 10 +++++----- @@ -13,7 +13,7 @@ --- leveldb.orig/Makefile +++ leveldb/Makefile -@@ -22,23 +22,23 @@ include build_config.mk +@@ -23,23 +23,23 @@ include build_config.mk # (see http://code.google.com/p/snappy/) ifeq ($(SNAPPY), 1) SNAPPY_CFLAGS=-DSNAPPY @@ -35,99 +35,99 @@ +GOOGLE_PERFTOOLS_LIBS= endif - CFLAGS += -c -I. -I./include $(PORT_CFLAGS) $(PLATFORM_CFLAGS) $(OPT) $(SNAPPY_CFLAGS) -fPIC + CFLAGS = -c -I. -I./include $(PORT_CFLAGS) $(PLATFORM_CFLAGS) $(OPT) $(SNAPPY_CFLAGS) -fPIC -LDFLAGS += $(PLATFORM_LDFLAGS) $(SNAPPY_LDFLAGS) $(GOOGLE_PERFTOOLS_LDFLAGS) +LIBS += $(PLATFORM_LIBS) $(SNAPPY_LIBS) $(GOOGLE_PERFTOOLS_LIBS) LIBOBJECTS = \ ./db/builder.o \ -@@ -120,68 +120,68 @@ $(LIBRARY): $(LIBOBJECTS) +@@ -121,68 +121,68 @@ $(LIBRARY): $(LIBOBJECTS) $(AR) -rs $@ $(LIBOBJECTS) db_bench: db/db_bench.o $(LIBOBJECTS) $(TESTUTIL) -- $(CC) $(LDFLAGS) db/db_bench.o $(LIBOBJECTS) $(TESTUTIL) -o $@ -+ $(CC) $(LDFLAGS) db/db_bench.o $(LIBOBJECTS) $(TESTUTIL) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) db/db_bench.o $(LIBOBJECTS) $(TESTUTIL) -o $@ ++ $(CXX) $(LDFLAGS) db/db_bench.o $(LIBOBJECTS) $(TESTUTIL) -o $@ $(LIBS) db_bench_sqlite3: doc/bench/db_bench_sqlite3.o $(LIBOBJECTS) $(TESTUTIL) -- $(CC) $(LDFLAGS) -lsqlite3 doc/bench/db_bench_sqlite3.o $(LIBOBJECTS) $(TESTUTIL) -o $@ -+ $(CC) $(LDFLAGS) doc/bench/db_bench_sqlite3.o $(LIBOBJECTS) $(TESTUTIL) -o $@ $(LIBS) -lsqlite3 +- $(CXX) $(LDFLAGS) -lsqlite3 doc/bench/db_bench_sqlite3.o $(LIBOBJECTS) $(TESTUTIL) -o $@ ++ $(CXX) $(LDFLAGS) doc/bench/db_bench_sqlite3.o $(LIBOBJECTS) $(TESTUTIL) -o $@ $(LIBS) -lsqlite3 db_bench_tree_db: doc/bench/db_bench_tree_db.o $(LIBOBJECTS) $(TESTUTIL) -- $(CC) $(LDFLAGS) -lkyotocabinet doc/bench/db_bench_tree_db.o $(LIBOBJECTS) $(TESTUTIL) -o $@ -+ $(CC) $(LDFLAGS) doc/bench/db_bench_tree_db.o $(LIBOBJECTS) $(TESTUTIL) -o $@ $(LIBS) -lkyotocabinet +- $(CXX) $(LDFLAGS) -lkyotocabinet doc/bench/db_bench_tree_db.o $(LIBOBJECTS) $(TESTUTIL) -o $@ ++ $(CXX) $(LDFLAGS) doc/bench/db_bench_tree_db.o $(LIBOBJECTS) $(TESTUTIL) -o $@ $(LIBS) -lkyotocabinet arena_test: util/arena_test.o $(LIBOBJECTS) $(TESTHARNESS) -- $(CC) $(LDFLAGS) util/arena_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) util/arena_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) util/arena_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) util/arena_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) c_test: db/c_test.o $(LIBOBJECTS) $(TESTHARNESS) -- $(CC) $(LDFLAGS) db/c_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) db/c_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) db/c_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) db/c_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) cache_test: util/cache_test.o $(LIBOBJECTS) $(TESTHARNESS) -- $(CC) $(LDFLAGS) util/cache_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) util/cache_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) util/cache_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) util/cache_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) coding_test: util/coding_test.o $(LIBOBJECTS) $(TESTHARNESS) -- $(CC) $(LDFLAGS) util/coding_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) util/coding_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) util/coding_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) util/coding_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) corruption_test: db/corruption_test.o $(LIBOBJECTS) $(TESTHARNESS) -- $(CC) $(LDFLAGS) db/corruption_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) db/corruption_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) db/corruption_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) db/corruption_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) crc32c_test: util/crc32c_test.o $(LIBOBJECTS) $(TESTHARNESS) -- $(CC) $(LDFLAGS) util/crc32c_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) util/crc32c_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) util/crc32c_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) util/crc32c_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) db_test: db/db_test.o $(LIBOBJECTS) $(TESTHARNESS) -- $(CC) $(LDFLAGS) db/db_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) db/db_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) db/db_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) db/db_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) dbformat_test: db/dbformat_test.o $(LIBOBJECTS) $(TESTHARNESS) -- $(CC) $(LDFLAGS) db/dbformat_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) db/dbformat_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) db/dbformat_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) db/dbformat_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) env_test: util/env_test.o $(LIBOBJECTS) $(TESTHARNESS) -- $(CC) $(LDFLAGS) util/env_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) util/env_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) util/env_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) util/env_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) filename_test: db/filename_test.o $(LIBOBJECTS) $(TESTHARNESS) -- $(CC) $(LDFLAGS) db/filename_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) db/filename_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) db/filename_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) db/filename_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) log_test: db/log_test.o $(LIBOBJECTS) $(TESTHARNESS) -- $(CC) $(LDFLAGS) db/log_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) db/log_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) db/log_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) db/log_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) table_test: table/table_test.o $(LIBOBJECTS) $(TESTHARNESS) -- $(CC) $(LDFLAGS) table/table_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) table/table_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) table/table_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) table/table_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) skiplist_test: db/skiplist_test.o $(LIBOBJECTS) $(TESTHARNESS) -- $(CC) $(LDFLAGS) db/skiplist_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) db/skiplist_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) db/skiplist_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) db/skiplist_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) version_edit_test: db/version_edit_test.o $(LIBOBJECTS) $(TESTHARNESS) -- $(CC) $(LDFLAGS) db/version_edit_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) db/version_edit_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) db/version_edit_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) db/version_edit_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) version_set_test: db/version_set_test.o $(LIBOBJECTS) $(TESTHARNESS) -- $(CC) $(LDFLAGS) db/version_set_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) db/version_set_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) db/version_set_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) db/version_set_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) write_batch_test: db/write_batch_test.o $(LIBOBJECTS) $(TESTHARNESS) -- $(CC) $(LDFLAGS) db/write_batch_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) db/write_batch_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) db/write_batch_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) db/write_batch_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(LIBS) $(MEMENVLIBRARY) : helpers/memenv/memenv.o rm -f $@ $(AR) -rs $@ helpers/memenv/memenv.o memenv_test : helpers/memenv/memenv_test.o $(MEMENVLIBRARY) $(LIBRARY) $(TESTHARNESS) -- $(CC) $(LDFLAGS) helpers/memenv/memenv_test.o $(MEMENVLIBRARY) $(LIBRARY) $(TESTHARNESS) -o $@ -+ $(CC) $(LDFLAGS) helpers/memenv/memenv_test.o $(MEMENVLIBRARY) $(LIBRARY) $(TESTHARNESS) -o $@ $(LIBS) +- $(CXX) $(LDFLAGS) helpers/memenv/memenv_test.o $(MEMENVLIBRARY) $(LIBRARY) $(TESTHARNESS) -o $@ ++ $(CXX) $(LDFLAGS) helpers/memenv/memenv_test.o $(MEMENVLIBRARY) $(LIBRARY) $(TESTHARNESS) -o $@ $(LIBS) ifeq ($(PLATFORM), IOS) # For iOS, create universal object files to be used on both the simulator and @@ -142,7 +142,7 @@ # Delete existing build_config.mk rm -f build_config.mk -@@ -18,22 +18,22 @@ case `uname -s` in +@@ -22,22 +22,22 @@ case `uname -s` in Darwin) PLATFORM=OS_MACOSX echo "PLATFORM_CFLAGS=-DOS_MACOSX" >> build_config.mk diff -Nru leveldb-0+20111031.git36a5f8e/debian/patches/0102-kfreebsd.patch leveldb-0+20120125.git3c8be10/debian/patches/0102-kfreebsd.patch --- leveldb-0+20111031.git36a5f8e/debian/patches/0102-kfreebsd.patch 2011-11-30 10:59:55.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/debian/patches/0102-kfreebsd.patch 2011-12-05 17:17:32.000000000 +0000 @@ -7,7 +7,7 @@ --- leveldb.orig/build_detect_platform +++ leveldb/build_detect_platform -@@ -35,6 +35,11 @@ case `uname -s` in +@@ -39,6 +39,11 @@ case `uname -s` in echo "PLATFORM_CFLAGS=-D_REENTRANT -DOS_FREEBSD" >> build_config.mk echo "PLATFORM_LIBS=-lpthread" >> build_config.mk ;; diff -Nru leveldb-0+20111031.git36a5f8e/debian/patches/0103-hurd.patch leveldb-0+20120125.git3c8be10/debian/patches/0103-hurd.patch --- leveldb-0+20111031.git36a5f8e/debian/patches/0103-hurd.patch 1970-01-01 00:00:00.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/debian/patches/0103-hurd.patch 2011-12-05 17:17:35.000000000 +0000 @@ -0,0 +1,38 @@ +Author: Pino Toscano +Description: Support for GNU/Hurd + This adds support for GNU/Hurd: + - detect the correct platform + - ignore msync() errors when they are ENOSYS, like currently it happens on + GNU/Hurd (not something that can be sent upstream, though) +Last-Update: 2011-12-01 + +--- + build_detect_platform | 5 +++++ + util/env_posix.cc | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +--- leveldb.orig/build_detect_platform ++++ leveldb/build_detect_platform +@@ -44,6 +44,11 @@ case `uname -s` in + echo "PLATFORM_CFLAGS=-pthread -DOS_FREEBSD" >> build_config.mk + echo "PLATFORM_LIBS=-lpthread -lrt" >> build_config.mk + ;; ++ GNU) ++ PLATFORM=OS_HURD ++ echo "PLATFORM_CFLAGS=-pthread -DOS_HURD" >> build_config.mk ++ echo "PLATFORM_LIBS=-lpthread" >> build_config.mk ++ ;; + *) + echo "Unknown platform!" + exit 1 +--- leveldb.orig/util/env_posix.cc ++++ leveldb/util/env_posix.cc +@@ -250,7 +250,7 @@ class PosixMmapFile : public WritableFil + size_t p1 = TruncateToPageBoundary(last_sync_ - base_); + size_t p2 = TruncateToPageBoundary(dst_ - base_ - 1); + last_sync_ = dst_; +- if (msync(base_ + p1, p2 - p1 + page_size_, MS_SYNC) < 0) { ++ if (msync(base_ + p1, p2 - p1 + page_size_, MS_SYNC) < 0 && errno != ENOSYS) { + s = IOError(filename_, errno); + } + } diff -Nru leveldb-0+20111031.git36a5f8e/debian/patches/1001-buildsystem.patch leveldb-0+20120125.git3c8be10/debian/patches/1001-buildsystem.patch --- leveldb-0+20111031.git36a5f8e/debian/patches/1001-buildsystem.patch 2011-11-08 13:49:07.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/debian/patches/1001-buildsystem.patch 2011-12-02 12:30:09.000000000 +0000 @@ -2,29 +2,17 @@ Description: Pass system's values of CFLAGS,LDFLAGS. Don't override OPT if it's already set. --- - Makefile | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) + Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) --- leveldb.orig/Makefile +++ leveldb/Makefile -@@ -8,7 +8,7 @@ CC = g++ - # Uncomment exactly one of the lines labelled (A), (B), and (C) below - # to switch between compilation modes. - --OPT = -O2 -DNDEBUG # (A) Production use (optimized mode) -+OPT ?= -O2 -DNDEBUG # (A) Production use (optimized mode) - # OPT = -g2 # (B) Debug mode, w/ full line-level debugging symbols - # OPT = -O2 -g2 -DNDEBUG # (C) Profiling mode: opt, but w/debugging symbols - #----------------------------------------------- -@@ -36,9 +36,9 @@ else +@@ -37,7 +37,7 @@ else GOOGLE_PERFTOOLS_LDFLAGS= endif -CFLAGS = -c -I. -I./include $(PORT_CFLAGS) $(PLATFORM_CFLAGS) $(OPT) $(SNAPPY_CFLAGS) -+CFLAGS += -c -I. -I./include $(PORT_CFLAGS) $(PLATFORM_CFLAGS) $(OPT) $(SNAPPY_CFLAGS) -fPIC ++CFLAGS = -c -I. -I./include $(PORT_CFLAGS) $(PLATFORM_CFLAGS) $(OPT) $(SNAPPY_CFLAGS) -fPIC --LDFLAGS=$(PLATFORM_LDFLAGS) $(SNAPPY_LDFLAGS) $(GOOGLE_PERFTOOLS_LDFLAGS) -+LDFLAGS += $(PLATFORM_LDFLAGS) $(SNAPPY_LDFLAGS) $(GOOGLE_PERFTOOLS_LDFLAGS) + LDFLAGS += $(PLATFORM_LDFLAGS) $(SNAPPY_LDFLAGS) $(GOOGLE_PERFTOOLS_LDFLAGS) - LIBOBJECTS = \ - ./db/builder.o \ diff -Nru leveldb-0+20111031.git36a5f8e/debian/patches/series leveldb-0+20120125.git3c8be10/debian/patches/series --- leveldb-0+20111031.git36a5f8e/debian/patches/series 2011-11-30 10:47:38.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/debian/patches/series 2011-12-05 18:07:37.000000000 +0000 @@ -10,3 +10,4 @@ 0009-Add-support-PARISC.patch 0101-as_needed.patch 0102-kfreebsd.patch +0103-hurd.patch diff -Nru leveldb-0+20111031.git36a5f8e/debian/rules leveldb-0+20120125.git3c8be10/debian/rules --- leveldb-0+20111031.git36a5f8e/debian/rules 2011-11-29 23:32:42.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/debian/rules 2011-12-02 12:28:19.000000000 +0000 @@ -4,6 +4,14 @@ export PREFIX=/usr export LIBDIR=lib +ifneq (,$(filter noopt,$(DEB_BUILD_OPTIONS))) + OPT=-O0 +else + OPT=-O2 +endif + +export OPT += -DNDEBUG + %: dh $@ --parallel diff -Nru leveldb-0+20111031.git36a5f8e/Makefile leveldb-0+20120125.git3c8be10/Makefile --- leveldb-0+20111031.git36a5f8e/Makefile 2011-11-08 13:50:06.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/Makefile 2012-02-02 12:20:22.000000000 +0000 @@ -2,15 +2,16 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. See the AUTHORS file for names of contributors. -CC = g++ +CXX ?= g++ +CC ?= gcc #----------------------------------------------- # Uncomment exactly one of the lines labelled (A), (B), and (C) below # to switch between compilation modes. -OPT = -O2 -DNDEBUG # (A) Production use (optimized mode) -# OPT = -g2 # (B) Debug mode, w/ full line-level debugging symbols -# OPT = -O2 -g2 -DNDEBUG # (C) Profiling mode: opt, but w/debugging symbols +OPT ?= -O2 -DNDEBUG # (A) Production use (optimized mode) +# OPT ?= -g2 # (B) Debug mode, w/ full line-level debugging symbols +# OPT ?= -O2 -g2 -DNDEBUG # (C) Profiling mode: opt, but w/debugging symbols #----------------------------------------------- # detect what platform we're building on @@ -38,7 +39,7 @@ CFLAGS = -c -I. -I./include $(PORT_CFLAGS) $(PLATFORM_CFLAGS) $(OPT) $(SNAPPY_CFLAGS) -LDFLAGS=$(PLATFORM_LDFLAGS) $(SNAPPY_LDFLAGS) $(GOOGLE_PERFTOOLS_LDFLAGS) +LDFLAGS += $(PLATFORM_LDFLAGS) $(SNAPPY_LDFLAGS) $(GOOGLE_PERFTOOLS_LDFLAGS) LIBOBJECTS = \ ./db/builder.o \ @@ -120,68 +121,68 @@ $(AR) -rs $@ $(LIBOBJECTS) db_bench: db/db_bench.o $(LIBOBJECTS) $(TESTUTIL) - $(CC) $(LDFLAGS) db/db_bench.o $(LIBOBJECTS) $(TESTUTIL) -o $@ + $(CXX) $(LDFLAGS) db/db_bench.o $(LIBOBJECTS) $(TESTUTIL) -o $@ db_bench_sqlite3: doc/bench/db_bench_sqlite3.o $(LIBOBJECTS) $(TESTUTIL) - $(CC) $(LDFLAGS) -lsqlite3 doc/bench/db_bench_sqlite3.o $(LIBOBJECTS) $(TESTUTIL) -o $@ + $(CXX) $(LDFLAGS) -lsqlite3 doc/bench/db_bench_sqlite3.o $(LIBOBJECTS) $(TESTUTIL) -o $@ db_bench_tree_db: doc/bench/db_bench_tree_db.o $(LIBOBJECTS) $(TESTUTIL) - $(CC) $(LDFLAGS) -lkyotocabinet doc/bench/db_bench_tree_db.o $(LIBOBJECTS) $(TESTUTIL) -o $@ + $(CXX) $(LDFLAGS) -lkyotocabinet doc/bench/db_bench_tree_db.o $(LIBOBJECTS) $(TESTUTIL) -o $@ arena_test: util/arena_test.o $(LIBOBJECTS) $(TESTHARNESS) - $(CC) $(LDFLAGS) util/arena_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) util/arena_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ c_test: db/c_test.o $(LIBOBJECTS) $(TESTHARNESS) - $(CC) $(LDFLAGS) db/c_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) db/c_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ cache_test: util/cache_test.o $(LIBOBJECTS) $(TESTHARNESS) - $(CC) $(LDFLAGS) util/cache_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) util/cache_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ coding_test: util/coding_test.o $(LIBOBJECTS) $(TESTHARNESS) - $(CC) $(LDFLAGS) util/coding_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) util/coding_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ corruption_test: db/corruption_test.o $(LIBOBJECTS) $(TESTHARNESS) - $(CC) $(LDFLAGS) db/corruption_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) db/corruption_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ crc32c_test: util/crc32c_test.o $(LIBOBJECTS) $(TESTHARNESS) - $(CC) $(LDFLAGS) util/crc32c_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) util/crc32c_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ db_test: db/db_test.o $(LIBOBJECTS) $(TESTHARNESS) - $(CC) $(LDFLAGS) db/db_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) db/db_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ dbformat_test: db/dbformat_test.o $(LIBOBJECTS) $(TESTHARNESS) - $(CC) $(LDFLAGS) db/dbformat_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) db/dbformat_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ env_test: util/env_test.o $(LIBOBJECTS) $(TESTHARNESS) - $(CC) $(LDFLAGS) util/env_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) util/env_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ filename_test: db/filename_test.o $(LIBOBJECTS) $(TESTHARNESS) - $(CC) $(LDFLAGS) db/filename_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) db/filename_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ log_test: db/log_test.o $(LIBOBJECTS) $(TESTHARNESS) - $(CC) $(LDFLAGS) db/log_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) db/log_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ table_test: table/table_test.o $(LIBOBJECTS) $(TESTHARNESS) - $(CC) $(LDFLAGS) table/table_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) table/table_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ skiplist_test: db/skiplist_test.o $(LIBOBJECTS) $(TESTHARNESS) - $(CC) $(LDFLAGS) db/skiplist_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) db/skiplist_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ version_edit_test: db/version_edit_test.o $(LIBOBJECTS) $(TESTHARNESS) - $(CC) $(LDFLAGS) db/version_edit_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) db/version_edit_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ version_set_test: db/version_set_test.o $(LIBOBJECTS) $(TESTHARNESS) - $(CC) $(LDFLAGS) db/version_set_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) db/version_set_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ write_batch_test: db/write_batch_test.o $(LIBOBJECTS) $(TESTHARNESS) - $(CC) $(LDFLAGS) db/write_batch_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) db/write_batch_test.o $(LIBOBJECTS) $(TESTHARNESS) -o $@ $(MEMENVLIBRARY) : helpers/memenv/memenv.o rm -f $@ $(AR) -rs $@ helpers/memenv/memenv.o memenv_test : helpers/memenv/memenv_test.o $(MEMENVLIBRARY) $(LIBRARY) $(TESTHARNESS) - $(CC) $(LDFLAGS) helpers/memenv/memenv_test.o $(MEMENVLIBRARY) $(LIBRARY) $(TESTHARNESS) -o $@ + $(CXX) $(LDFLAGS) helpers/memenv/memenv_test.o $(MEMENVLIBRARY) $(LIBRARY) $(TESTHARNESS) -o $@ ifeq ($(PLATFORM), IOS) # For iOS, create universal object files to be used on both the simulator and @@ -192,9 +193,9 @@ .cc.o: mkdir -p ios-x86/$(dir $@) - $(SIMULATORROOT)/usr/bin/$(CC) $(CFLAGS) -isysroot $(SIMULATORROOT)/SDKs/iPhoneSimulator$(IOSVERSION).sdk -arch i686 $< -o ios-x86/$@ + $(SIMULATORROOT)/usr/bin/$(CXX) $(CFLAGS) -isysroot $(SIMULATORROOT)/SDKs/iPhoneSimulator$(IOSVERSION).sdk -arch i686 $< -o ios-x86/$@ mkdir -p ios-arm/$(dir $@) - $(DEVICEROOT)/usr/bin/$(CC) $(CFLAGS) -isysroot $(DEVICEROOT)/SDKs/iPhoneOS$(IOSVERSION).sdk -arch armv6 -arch armv7 $< -o ios-arm/$@ + $(DEVICEROOT)/usr/bin/$(CXX) $(CFLAGS) -isysroot $(DEVICEROOT)/SDKs/iPhoneOS$(IOSVERSION).sdk -arch armv6 -arch armv7 $< -o ios-arm/$@ lipo ios-x86/$@ ios-arm/$@ -create -output $@ .c.o: @@ -206,7 +207,7 @@ else .cc.o: - $(CC) $(CFLAGS) $< -o $@ + $(CXX) $(CFLAGS) $< -o $@ .c.o: $(CC) $(CFLAGS) $< -o $@ diff -Nru leveldb-0+20111031.git36a5f8e/util/comparator.cc leveldb-0+20120125.git3c8be10/util/comparator.cc --- leveldb-0+20111031.git36a5f8e/util/comparator.cc 2011-11-08 13:50:06.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/util/comparator.cc 2012-02-02 12:20:22.000000000 +0000 @@ -64,10 +64,13 @@ } }; } // namespace -static const BytewiseComparatorImpl bytewise; + +// Intentionally not destroyed to prevent destructor racing +// with background threads. +static const Comparator* bytewise = new BytewiseComparatorImpl; const Comparator* BytewiseComparator() { - return &bytewise; + return bytewise; } } // namespace leveldb diff -Nru leveldb-0+20111031.git36a5f8e/util/env.cc leveldb-0+20120125.git3c8be10/util/env.cc --- leveldb-0+20111031.git36a5f8e/util/env.cc 2011-11-08 13:50:06.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/util/env.cc 2012-02-02 12:20:22.000000000 +0000 @@ -33,14 +33,18 @@ } } -Status WriteStringToFile(Env* env, const Slice& data, - const std::string& fname) { +static Status DoWriteStringToFile(Env* env, const Slice& data, + const std::string& fname, + bool should_sync) { WritableFile* file; Status s = env->NewWritableFile(fname, &file); if (!s.ok()) { return s; } s = file->Append(data); + if (s.ok() && should_sync) { + s = file->Sync(); + } if (s.ok()) { s = file->Close(); } @@ -51,6 +55,16 @@ return s; } +Status WriteStringToFile(Env* env, const Slice& data, + const std::string& fname) { + return DoWriteStringToFile(env, data, fname, false); +} + +Status WriteStringToFileSync(Env* env, const Slice& data, + const std::string& fname) { + return DoWriteStringToFile(env, data, fname, true); +} + Status ReadFileToString(Env* env, const std::string& fname, std::string* data) { data->clear(); SequentialFile* file; diff -Nru leveldb-0+20111031.git36a5f8e/util/env_test.cc leveldb-0+20120125.git3c8be10/util/env_test.cc --- leveldb-0+20111031.git36a5f8e/util/env_test.cc 2011-11-08 13:50:06.000000000 +0000 +++ leveldb-0+20120125.git3c8be10/util/env_test.cc 2012-02-02 12:20:22.000000000 +0000 @@ -22,29 +22,30 @@ }; static void SetBool(void* ptr) { - *(reinterpret_cast(ptr)) = true; + reinterpret_cast(ptr)->NoBarrier_Store(ptr); } TEST(EnvPosixTest, RunImmediately) { - bool called = false; + port::AtomicPointer called (NULL); env_->Schedule(&SetBool, &called); Env::Default()->SleepForMicroseconds(kDelayMicros); - ASSERT_TRUE(called); + ASSERT_TRUE(called.NoBarrier_Load() != NULL); } TEST(EnvPosixTest, RunMany) { - int last_id = 0; + port::AtomicPointer last_id (NULL); struct CB { - int* last_id_ptr; // Pointer to shared slot - int id; // Order# for the execution of this callback + port::AtomicPointer* last_id_ptr; // Pointer to shared slot + uintptr_t id; // Order# for the execution of this callback - CB(int* p, int i) : last_id_ptr(p), id(i) { } + CB(port::AtomicPointer* p, int i) : last_id_ptr(p), id(i) { } static void Run(void* v) { CB* cb = reinterpret_cast(v); - ASSERT_EQ(cb->id-1, *cb->last_id_ptr); - *cb->last_id_ptr = cb->id; + void* cur = cb->last_id_ptr->NoBarrier_Load(); + ASSERT_EQ(cb->id-1, reinterpret_cast(cur)); + cb->last_id_ptr->Release_Store(reinterpret_cast(cb->id)); } }; @@ -59,7 +60,8 @@ env_->Schedule(&CB::Run, &cb4); Env::Default()->SleepForMicroseconds(kDelayMicros); - ASSERT_EQ(4, last_id); + void* cur = last_id.Acquire_Load(); + ASSERT_EQ(4, reinterpret_cast(cur)); } struct State {