1// Lockable.h
2
3#ifndef NET_FS_LOCKABLE_H
4#define NET_FS_LOCKABLE_H
5
6#include <util/DoublyLinkedList.h>
7
8#include "Blocker.h"
9
10// LockerCandidate
11class LockerCandidate : public DoublyLinkedListLinkImpl<LockerCandidate> {
12public:
13								LockerCandidate(Blocker blocker);
14
15			thread_id			GetThread() const;
16
17			status_t			Block();
18			status_t			Unblock(bool success);
19
20private:
21			Blocker				fBlocker;
22			thread_id			fThread;
23};
24
25typedef DoublyLinkedList<LockerCandidate> LockerCandidateList;
26
27// Lockable
28class Lockable {
29public:
30								Lockable();
31								~Lockable();
32
33			bool				Lock();		// non-blocking
34			void				Unlock();
35			bool				IsLocked() const;
36
37			void				QueueLockerCandidate(
38									LockerCandidate* candidate);
39
40private:
41			LockerCandidateList	fLockerCandidates;
42			thread_id			fLockOwner;
43			int32				fLockCounter;
44};
45
46#endif	// NET_FS_LOCKABLE_H
47