1/*
2 * Copyright 2012 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Pawe�� Dziepak, pdziepak@quarnos.org
7 */
8#ifndef METADATACACHE_H
9#define METADATACACHE_H
10
11
12#include <fs_interface.h>
13#include <lock.h>
14#include <SupportDefs.h>
15#include <util/AutoLock.h>
16#include <util/AVLTreeMap.h>
17
18
19class Inode;
20
21struct AccessEntry {
22	time_t	fExpire;
23	bool	fForceValid;
24
25	uint32	fAllowed;
26};
27
28class MetadataCache {
29public:
30								MetadataCache(Inode* inode);
31								~MetadataCache();
32
33					status_t	GetStat(struct stat* st);
34					void		SetStat(const struct stat& st);
35					void		GrowFile(size_t newSize);
36
37					status_t	GetAccess(uid_t uid, uint32* allowed);
38					void		SetAccess(uid_t uid, uint32 allowed);
39
40					status_t	LockValid();
41					void		UnlockValid();
42
43	inline			void		InvalidateStat();
44	inline			void		InvalidateAccess();
45
46	inline			void		Invalidate();
47
48	static const	time_t		kExpirationTime	= 60;
49
50protected:
51					void		NotifyChanges(const struct stat* oldStat,
52									const struct stat* newStat);
53
54private:
55					struct stat	fStatCache;
56					time_t		fExpire;
57					bool		fForceValid;
58
59					Inode*		fInode;
60					bool		fInited;
61
62					AVLTreeMap<uid_t, AccessEntry>	fAccessCache;
63
64					mutex		fLock;
65};
66
67
68inline void
69MetadataCache::InvalidateStat()
70{
71	MutexLocker _(fLock);
72	if (!fForceValid)
73		fExpire = 0;
74}
75
76
77inline void
78MetadataCache::InvalidateAccess()
79{
80	MutexLocker _(fLock);
81	if (!fForceValid)
82		fAccessCache.MakeEmpty();
83}
84
85
86inline void
87MetadataCache::Invalidate()
88{
89	InvalidateStat();
90	InvalidateAccess();
91}
92
93
94#endif	// METADATACACHE_H
95
96