1 //-----------------------------------------------------------------------
5 #include "jdb_kobject.h"
10 class Jdb_kobject_name : public Jdb_kobject_extension
13 static char const *const static_type;
14 virtual char const *type() const { return static_type; }
16 ~Jdb_kobject_name() {}
18 void *operator new (size_t) throw();
19 void operator delete (void *);
25 static Jdb_kobject_name *_names;
28 //-----------------------------------------------------------------------
35 #include "kmem_alloc.h"
39 #include "static_init.h"
45 Name_buffer_size = 8192,
46 Name_entries = Name_buffer_size / sizeof(Jdb_kobject_name),
50 char const *const Jdb_kobject_name::static_type = "Jdb_kobject_names";
51 Jdb_kobject_name *Jdb_kobject_name::_names;
56 Jdb_kobject_name::max_len()
57 { return sizeof(_name); }
61 Jdb_kobject_name::name(char const *name)
63 strncpy(_name, name, sizeof(_name));
67 Jdb_kobject_name::Jdb_kobject_name()
70 static Spin_lock allocator_lock;
74 Jdb_kobject_name::operator new (size_t) throw()
76 Jdb_kobject_name *n = _names;
79 void **o = reinterpret_cast<void**>(n);
82 Lock_guard<Spin_lock> g(&allocator_lock);
92 if ((n - _names) >= Name_entries)
99 Jdb_kobject_name::operator delete (void *p)
101 Lock_guard<Spin_lock> g(&allocator_lock);
102 void **o = reinterpret_cast<void**>(p);
108 Jdb_kobject_name::clear_name()
110 for (unsigned i = 0; i < max_len(); ++i)
116 Jdb_kobject_name::name() const
121 Jdb_kobject_name::name()
124 #if 0 // XXX use copy from user later
127 Name_entry::set(Global_id id, const char *name)
130 Mem_space * const s = current()->mem_space();
133 for (i=0; i<sizeof(_name)-1; i++)
135 _name[i] = s->peek_user(name++);
143 class Jdb_name_hdl : public Jdb_kobject_handler
146 Jdb_name_hdl() : Jdb_kobject_handler(0) {}
147 virtual bool show_kobject(Kobject *, int) { return true; }
148 virtual ~Jdb_name_hdl() {}
153 Jdb_name_hdl::show_kobject_short(char *buf, int max, Kobject *o)
156 = Jdb_kobject_extension::find_extension<Jdb_kobject_name>(o);
159 return snprintf(buf, max, " {%-*.*s}", ex->max_len(), ex->max_len(), ex->name());
166 Jdb_name_hdl::invoke(Kobject *o, Syscall_frame *f, Utcb *utcb)
168 if (utcb->values[0] == 0)
172 f->tag(Kobject_iface::commit_result(-L4_err::EInval));
175 Jdb_kobject_name *ne = new Jdb_kobject_name();
178 f->tag(Kobject_iface::commit_result(-L4_err::ENomem));
182 char const *name = reinterpret_cast<char const*>(&utcb->values[1]);
184 strncpy(ne->name(), name, ne->max_len());
185 ne->add(&o->_jdb_data);
186 f->tag(Kobject_iface::commit_result(0));
192 PUBLIC static FIASCO_INIT
194 Jdb_kobject_name::init()
196 _names = (Jdb_kobject_name*)Kmem_alloc::allocator()->unaligned_alloc(Name_buffer_size);
198 panic("No memory for thread names");
200 for (int i=0; i<Name_entries; i++)
201 *reinterpret_cast<unsigned long*>(_names + i) = 0;
203 static Jdb_name_hdl hdl;
204 Jdb_kobject::module()->register_handler(&hdl);
208 STATIC_INITIALIZE(Jdb_kobject_name);