Close() and unlink() files in ways that make Windows happy
authorPhilip Craig <philip@pobox.com>
Sat, 23 Apr 2011 10:36:49 +0000 (11:36 +0100)
committerEvan Martin <martine@danga.com>
Sat, 23 Apr 2011 21:31:47 +0000 (14:31 -0700)
This will make the build log compaction work on Windows.
It will also make the tests no longer leave a temp log file around.

src/build_log.cc

index 9add945acd22ef00f5ecf12a1525bd908de8683a..69435507cb8d4b96271d0aea9b2531b4be8217e1 100644 (file)
@@ -37,6 +37,7 @@ bool BuildLog::OpenForWrite(const string& path, string* err) {
     return true;  // Do nothing, report success.
 
   if (needs_recompaction_) {
+    Close();
     if (!Recompact(path, err))
       return false;
   }
@@ -129,6 +130,8 @@ bool BuildLog::Load(const string& path, string* err) {
   if (total_entry_count > unique_entry_count * kCompactionRatio)
     needs_recompaction_ = true;
 
+  fclose(file);
+
   return true;
 }
 
@@ -159,6 +162,10 @@ bool BuildLog::Recompact(const string& path, string* err) {
   }
 
   fclose(f);
+  if (unlink(path.c_str()) < 0) {
+    *err = strerror(errno);
+    return false;
+  }
 
   if (rename(temp_path.c_str(), path.c_str()) < 0) {
     *err = strerror(errno);