190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright (c) 2013 The LevelDB Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file. See the AUTHORS file for names of contributors.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#ifndef THIRD_PARTY_LEVELDATABASE_ENV_CHROMIUM_H_
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define THIRD_PARTY_LEVELDATABASE_ENV_CHROMIUM_H_
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <deque>
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <map>
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <set>
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <string>
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <vector>
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/files/file.h"
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/file_path.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/metrics/histogram.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "leveldb/env.h"
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "port/port_chromium.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "util/mutexlock.h"
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace leveldb_env {
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)enum MethodID {
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kSequentialFileRead,
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kSequentialFileSkip,
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kRandomAccessFileRead,
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kWritableFileAppend,
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kWritableFileClose,
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kWritableFileFlush,
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kWritableFileSync,
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kNewSequentialFile,
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kNewRandomAccessFile,
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kNewWritableFile,
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kDeleteFile,
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kCreateDir,
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kDeleteDir,
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kGetFileSize,
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kRenameFile,
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kLockFile,
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kUnlockFile,
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kGetTestDirectory,
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kNewLogger,
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  kSyncParent,
448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  kGetChildren,
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  kNumEntries
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char* MethodIDToString(MethodID method);
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)leveldb::Status MakeIOError(leveldb::Slice filename,
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            const char* message,
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            MethodID method,
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            int saved_errno);
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)leveldb::Status MakeIOError(leveldb::Slice filename,
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            const char* message,
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            MethodID method,
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            base::File::Error error);
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)leveldb::Status MakeIOError(leveldb::Slice filename,
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            const char* message,
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            MethodID method);
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)enum ErrorParsingResult {
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  METHOD_ONLY,
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  METHOD_AND_PFE,
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  METHOD_AND_ERRNO,
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  NONE,
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)ErrorParsingResult ParseMethodAndError(const char* string,
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       MethodID* method,
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       int* error);
720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)int GetCorruptionCode(const leveldb::Status& status);
730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)int GetNumCorruptionCodes();
740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)std::string GetCorruptionMessage(const leveldb::Status& status);
750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)bool IndicatesDiskFull(const leveldb::Status& status);
760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)bool IsIOError(const leveldb::Status& status);
770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)bool IsCorruption(const leveldb::Status& status);
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)std::string FilePathToString(const base::FilePath& file_path);
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class UMALogger {
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void RecordErrorAt(MethodID method) const = 0;
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void RecordOSError(MethodID method, int saved_errno) const = 0;
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void RecordOSError(MethodID method,
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             base::File::Error error) const = 0;
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void RecordBackupResult(bool success) const = 0;
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class RetrierProvider {
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual int MaxRetryTimeMillis() const = 0;
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual base::HistogramBase* GetRetryTimeHistogram(MethodID method) const = 0;
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual base::HistogramBase* GetRecoveredFromErrorHistogram(
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      MethodID method) const = 0;
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class WriteTracker {
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void DidCreateNewFile(const std::string& fname) = 0;
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual bool DoesDirNeedSync(const std::string& fname) = 0;
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void DidSyncDir(const std::string& fname) = 0;
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class ChromiumEnv : public leveldb::Env,
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    public UMALogger,
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    public RetrierProvider,
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    public WriteTracker {
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  typedef void(ScheduleFunc)(void*);
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool MakeBackup(const std::string& fname);
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static base::FilePath CreateFilePath(const std::string& file_path);
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static const char* FileErrorString(::base::File::Error error);
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool HasTableExtension(const base::FilePath& path);
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~ChromiumEnv();
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual bool FileExists(const std::string& fname);
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual leveldb::Status GetChildren(const std::string& dir,
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                      std::vector<std::string>* result);
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual leveldb::Status DeleteFile(const std::string& fname);
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual leveldb::Status CreateDir(const std::string& name);
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual leveldb::Status DeleteDir(const std::string& name);
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual leveldb::Status GetFileSize(const std::string& fname, uint64_t* size);
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual leveldb::Status RenameFile(const std::string& src,
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                     const std::string& dst);
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual leveldb::Status LockFile(const std::string& fname,
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   leveldb::FileLock** lock);
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual leveldb::Status UnlockFile(leveldb::FileLock* lock);
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void Schedule(ScheduleFunc*, void* arg);
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void StartThread(void (*function)(void* arg), void* arg);
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual leveldb::Status GetTestDirectory(std::string* path);
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual uint64_t NowMicros();
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SleepForMicroseconds(int micros);
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected:
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ChromiumEnv();
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void DidCreateNewFile(const std::string& fname);
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual bool DoesDirNeedSync(const std::string& fname);
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void DidSyncDir(const std::string& fname);
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual base::File::Error GetDirectoryEntries(
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const base::FilePath& dir_param,
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      std::vector<base::FilePath>* result) const = 0;
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void RecordErrorAt(MethodID method) const;
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void RecordOSError(MethodID method, int saved_errno) const;
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void RecordOSError(MethodID method,
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             base::File::Error error) const;
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::HistogramBase* GetMaxFDHistogram(const std::string& type) const;
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::HistogramBase* GetOSErrorHistogram(MethodID method, int limit) const;
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string name_;
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool make_backup_;
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // File locks may not be exclusive within a process (e.g. on POSIX). Track
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // locks held by the ChromiumEnv to prevent access within the process.
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  class LockTable {
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   public:
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    bool Insert(const std::string& fname) {
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      leveldb::MutexLock l(&mu_);
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return locked_files_.insert(fname).second;
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    bool Remove(const std::string& fname) {
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      leveldb::MutexLock l(&mu_);
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return locked_files_.erase(fname) == 1;
1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   private:
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    leveldb::port::Mutex mu_;
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    std::set<std::string> locked_files_;
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  };
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::map<std::string, bool> needs_sync_map_;
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::Lock map_lock_;
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const int kMaxRetryTimeMillis;
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // BGThread() is the body of the background thread
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void BGThread();
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  static void BGThreadWrapper(void* arg) {
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    reinterpret_cast<ChromiumEnv*>(arg)->BGThread();
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void RecordBackupResult(bool result) const;
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void RestoreIfNecessary(const std::string& dir,
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                          std::vector<std::string>* children);
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::FilePath RestoreFromBackup(const base::FilePath& base_name);
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void RecordLockFileAncestors(int num_missing_ancestors) const;
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::HistogramBase* GetMethodIOErrorHistogram() const;
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::HistogramBase* GetLockFileAncestorHistogram() const;
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // RetrierProvider implementation.
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual int MaxRetryTimeMillis() const { return kMaxRetryTimeMillis; }
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual base::HistogramBase* GetRetryTimeHistogram(MethodID method) const;
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual base::HistogramBase* GetRecoveredFromErrorHistogram(
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      MethodID method) const;
195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::FilePath test_directory_;
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ::base::Lock mu_;
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ::base::ConditionVariable bgsignal_;
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool started_bgthread_;
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Entry per Schedule() call
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct BGItem {
204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    void* arg;
205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    void (*function)(void*);
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  typedef std::deque<BGItem> BGQueue;
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  BGQueue queue_;
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LockTable locks_;
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace leveldb_env
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif  // THIRD_PARTY_LEVELDATABASE_ENV_CHROMIUM_H_
215