snapshot

// 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:

		SequenceNumber number_;  // const after creation

	private:

		friend class SnapshotList;

		// SnapshotImpl is kept in a doubly-linked circular list
		SnapshotImpl* prev_;
		SnapshotImpl* next_;

		SnapshotList* list_;                 // just for sanity checks
	};

	class SnapshotList 
	{

	public:

		SnapshotList()
		{
			list_.prev_ = &list_;
			list_.next_ = &list_;
		}

		bool empty() const 
		{ 
			return list_.next_ == &list_; 
		}

		SnapshotImpl* oldest() constassert(!empty());
			return list_.next_; 
		}

		SnapshotImpl* newest() const 
		{ 
			assert(!empty()); 
			return list_.prev_;
		}

		const SnapshotImpl* New(SequenceNumber seq) 
		{
			SnapshotImpl* s = new SnapshotImpl;
			s->number_ = seq;
			s->list_ = this;
			// 在list_的前面位置插入一个new的对象
			s->next_ = &list_;
			s->prev_ = list_.prev_;
			s->prev_->next_ = s;
			s->next_->prev_ = s;
			return s;
		}

		void Deleteconst SnapshotImpl* s ) 
		{
			assert( s->list_ == this );
			s->prev_->next_ = s->next_;
			s->next_->prev_ = s->prev_;
			delete s;
		}

	private:
		// Dummy head of doubly-linked list of snapshots
		SnapshotImpl list_;
	};

}  // namespace leveldb

#endif  // STORAGE_LEVELDB_DB_SNAPSHOT_H_

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值