7 //----------------------------------------------------------------------------
10 #include "spin_lock.h"
11 #include "lock_guard.h"
17 EXTENSION class Kobject_dbg : public cxx::D_list_item
19 friend class Jdb_kobject;
20 friend class Jdb_kobject_list;
21 friend class Jdb_mapdb;
24 class Dbg_extension : public cxx::H_list_item
27 virtual ~Dbg_extension() = 0;
31 typedef cxx::H_list<Dbg_extension> Dbg_ext_list;
32 Dbg_ext_list _jdb_data;
38 Mword dbg_id() const { return _dbg_id; }
39 virtual Address kobject_start_addr() const = 0;
40 virtual Mword kobject_size() const = 0;
41 virtual ~Kobject_dbg() = 0;
44 typedef cxx::D_list<Kobject_dbg> Kobject_list;
45 typedef Kobject_list::Iterator Iterator;
46 typedef Kobject_list::Const_iterator Const_iterator;
48 static Spin_lock<> _kobjects_lock;
49 static Kobject_list _kobjects;
51 static Iterator begin() { return _kobjects.begin(); }
52 static Iterator end() { return _kobjects.end(); }
55 static unsigned long _next_dbg_id;
59 //----------------------------------------------------------------------------
60 IMPLEMENTATION[debug]:
61 #include "static_init.h"
62 Spin_lock<> Kobject_dbg::_kobjects_lock;
63 Kobject_dbg::Kobject_list Kobject_dbg::_kobjects INIT_PRIORITY(101);
64 unsigned long Kobject_dbg::_next_dbg_id;
66 IMPLEMENT inline Kobject_dbg::Dbg_extension::~Dbg_extension() {}
70 Kobject_dbg::pointer_to_obj(void const *p)
72 for (Iterator l = _kobjects.begin(); l != _kobjects.end(); ++l)
74 Mword a = l->kobject_start_addr();
75 if (a <= Mword(p) && Mword(p) < (a + l->kobject_size()))
78 return _kobjects.end();
83 Kobject_dbg::pointer_to_id(void const *p)
85 Iterator o = pointer_to_obj(p);
86 if (o != _kobjects.end())
93 Kobject_dbg::is_kobj(void const *o)
95 return pointer_to_obj(o) != _kobjects.end();
100 Kobject_dbg::id_to_obj(unsigned long id)
102 for (Iterator l = _kobjects.begin(); l != _kobjects.end(); ++l)
104 if (l->dbg_id() == id)
112 Kobject_dbg::obj_to_id(void const *o)
114 return pointer_to_id(o);
119 Kobject_dbg::Kobject_dbg()
121 Lock_guard<decltype(_kobjects_lock)> guard(&_kobjects_lock);
123 _dbg_id = _next_dbg_id++;
124 _kobjects.push_back(this);
128 Kobject_dbg::~Kobject_dbg()
131 Lock_guard<decltype(_kobjects_lock)> guard(&_kobjects_lock);
132 _kobjects.remove(this);
135 while (Dbg_extension *ex = _jdb_data.front())
139 //---------------------------------------------------------------------------
140 IMPLEMENTATION [!debug]:
144 Kobject_dbg::dbg_id() const
149 Kobject_dbg::dbg_id(void const *)
154 Kobject_dbg::pointer_to_obj(void const *)
159 Kobject_dbg::pointer_to_id(void const *)
164 Kobject_dbg::is_kobj(void const *)
169 Kobject_dbg::id_to_obj(unsigned long)
174 Kobject_dbg::obj_to_id(void const *)