git / moonbite-core / src/leveldb/db/snapshot.h · raw

// Copyright (c) 2011 The LevelDB Authors. All rights reserved.// 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.#ifndef STORAGE_LEVELDB_DB_SNAPSHOT_H_#define STORAGE_LEVELDB_DB_SNAPSHOT_H_#include "db/dbformat.h"#include "leveldb/db.h"namespace leveldb {class SnapshotList;// Snapshots are kept in a doubly-linked list in the DB.// Each SnapshotImpl corresponds to a particular sequence number.class SnapshotImpl : public Snapshot { public:  SnapshotImpl(SequenceNumber sequence_number)      : sequence_number_(sequence_number) {}  SequenceNumber sequence_number() const { return sequence_number_; } private:  friend class SnapshotList;  // SnapshotImpl is kept in a doubly-linked circular list. The SnapshotList  // implementation operates on the next/previous fields direcly.  SnapshotImpl* prev_;  SnapshotImpl* next_;  const SequenceNumber sequence_number_;#if !defined(NDEBUG)  SnapshotList* list_ = nullptr;#endif  // !defined(NDEBUG)};class SnapshotList { public:  SnapshotList() : head_(0) {    head_.prev_ = &head_;    head_.next_ = &head_;  }  bool empty() const { return head_.next_ == &head_; }  SnapshotImpl* oldest() const {    assert(!empty());    return head_.next_;  }  SnapshotImpl* newest() const {    assert(!empty());    return head_.prev_;  }  // Creates a SnapshotImpl and appends it to the end of the list.  SnapshotImpl* New(SequenceNumber sequence_number) {    assert(empty() || newest()->sequence_number_ <= sequence_number);    SnapshotImpl* snapshot = new SnapshotImpl(sequence_number);#if !defined(NDEBUG)    snapshot->list_ = this;#endif  // !defined(NDEBUG)    snapshot->next_ = &head_;    snapshot->prev_ = head_.prev_;    snapshot->prev_->next_ = snapshot;    snapshot->next_->prev_ = snapshot;    return snapshot;  }  // Removes a SnapshotImpl from this list.  //  // The snapshot must have been created by calling New() on this list.  //  // The snapshot pointer should not be const, because its memory is  // deallocated. However, that would force us to change DB::ReleaseSnapshot(),  // which is in the API, and currently takes a const Snapshot.  void Delete(const SnapshotImpl* snapshot) {#if !defined(NDEBUG)    assert(snapshot->list_ == this);#endif  // !defined(NDEBUG)    snapshot->prev_->next_ = snapshot->next_;    snapshot->next_->prev_ = snapshot->prev_;    delete snapshot;  } private:  // Dummy head of doubly-linked list of snapshots  SnapshotImpl head_;};}  // namespace leveldb#endif  // STORAGE_LEVELDB_DB_SNAPSHOT_H_