1/* 2 * Copyright 2001-2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef USERLAND_FS_OBJECT_TRACKER_H 6#define USERLAND_FS_OBJECT_TRACKER_H 7 8#include <util/DoublyLinkedList.h> 9 10#include "Locker.h" 11 12namespace UserlandFSUtil { 13 14class ObjectTracker; 15class GetObjectTrackableLink; 16 17// ObjectTrackable 18class ObjectTrackable { 19public: 20 ObjectTrackable(); 21 virtual ~ObjectTrackable(); 22 23private: 24 friend class ObjectTracker; 25 friend class GetObjectTrackableLink; 26 27 DoublyLinkedListLink<ObjectTrackable> fLink; 28}; 29 30// GetObjectTrackableLink 31struct GetObjectTrackableLink { 32 inline DoublyLinkedListLink<ObjectTrackable> *operator()( 33 ObjectTrackable* trackable) const 34 { 35 return &trackable->fLink; 36 } 37 38 inline const DoublyLinkedListLink<ObjectTrackable> *operator()( 39 const ObjectTrackable* trackable) const 40 { 41 return &trackable->fLink; 42 } 43}; 44 45// ObjectTracker 46class ObjectTracker { 47private: 48 ObjectTracker(); 49 ~ObjectTracker(); 50 51public: 52 53 static ObjectTracker* InitDefault(); 54 static void ExitDefault(); 55 static ObjectTracker* GetDefault(); 56 57private: 58 friend class ObjectTrackable; 59 60 void AddTrackable(ObjectTrackable* trackable); 61 void RemoveTrackable(ObjectTrackable* trackable); 62 63private: 64 Locker fLock; 65 DoublyLinkedList<ObjectTrackable, GetObjectTrackableLink> 66 fTrackables; 67 68 static ObjectTracker* sTracker; 69}; 70 71} // namespace UserlandFSUtil 72 73using UserlandFSUtil::ObjectTrackable; 74using UserlandFSUtil::ObjectTracker; 75 76#ifdef DEBUG_OBJECT_TRACKING 77# define ONLY_OBJECT_TRACKABLE_BASE_CLASS : private ObjectTrackable 78# define FIRST_OBJECT_TRACKABLE_BASE_CLASS private ObjectTrackable, 79#else 80# define ONLY_OBJECT_TRACKABLE_BASE_CLASS 81# define FIRST_OBJECT_TRACKABLE_BASE_CLASS 82#endif 83 84#endif // USERLAND_FS_OBJECT_TRACKER_H 85