1/*
2 * Copyright 2017, Ch��� V�� Gia Hy, cvghy116@gmail.com.
3 * Copyright 2001-2012, Axel D��rfler, axeld@pinc-software.de.
4 * This file may be used under the terms of the MIT License.
5 */
6#ifndef JOURNAL_H
7#define JOURNAL_H
8
9
10#include "Volume.h"
11
12class Transaction;
13
14
15class Journal {
16public:
17							Journal(Volume* volume);
18							~Journal();
19
20			Volume*			GetVolume() const { return fVolume; }
21			Transaction*	CurrentTransaction() const { return fOwner; }
22			uint64			SystemTransactionID() const
23								{ return fCurrentGeneration; }
24			int32			TransactionID() const { return fTransactionID; }
25			status_t		Lock(Transaction* owner);
26			status_t		UnLock(Transaction* owner, bool success);
27
28private:
29	static	void			_TransactionWritten(int32 transactionID, int32 event,
30								void* _journal);
31			status_t		_TransactionDone(bool success);
32
33private:
34			Volume*			fVolume;
35			recursive_lock	fLock;
36			Transaction*	fOwner;
37			int32			fTransactionID;
38			uint64			fCurrentGeneration;
39};
40
41
42class Transaction {
43public:
44							Transaction(Volume* volume);
45							Transaction();
46							~Transaction();
47
48			Journal*		GetJournal() const { return fJournal; }
49			int32			ID() const { return fJournal->TransactionID(); }
50			uint64			SystemID() const
51								{ return fJournal->SystemTransactionID(); }
52			bool			HasBlock(fsblock_t blockNumber) const;
53			Transaction*	Parent() const { return fParent; }
54			void			SetParent(Transaction* parent) { fParent = parent; }
55			status_t		Start(Volume* volume);
56			status_t		Done();
57private:
58			Journal*		fJournal;
59			Transaction*	fParent;
60};
61
62
63#endif	// JOURNAL_H
64