Files
jsix_import/src/kernel/objects/kobject.cpp
Justin C. Miller d2a6113fb7 [kernel] Fix frame allocation for multiple pages
There was an inverted boolean logic in determining how many consecutive
pages were available.

Also adding some memory debugging tools I added to track down the recent
memory bugs:

- A direct debugcon::write call, for logging to the debugcon without the
  possible page faults with the logger.
- A new vm_space::lock call, to make a page not fillable in memory
  debugging mode
- A mode in heap_allocator to always alloc new pages, and lock freed
  pages to cause page faults for use-after-free bugs.
- Logging in kobject on creation and deletion
- Page table cache structs are now page-sized for easy pointer math
2023-02-19 01:07:13 -08:00

60 lines
1.3 KiB
C++

#include <j6/errors.h>
#include <j6/types.h>
#include "assert.h"
#include "logger.h"
#include "objects/kobject.h"
#include "objects/thread.h"
namespace obj {
static constexpr unsigned types_count = static_cast<unsigned>(kobject::type::max);
static uint32_t next_oids [types_count] = { 0 };
static_assert(types_count <= (1 << kobject::koid_type_bits),
"kobject::koid_type_bits cannot represent all kobject types");
static const char *type_names[] = {
#define OBJECT_TYPE( name, val ) #name ,
#include <j6/tables/object_types.inc>
#undef OBJECT_TYPE
nullptr
};
static uint32_t
oid_generate(kobject::type t)
{
kassert(t < kobject::type::max, "Object type out of bounds");
unsigned type_int = static_cast<unsigned>(t);
return __atomic_fetch_add(&next_oids[type_int], 1, __ATOMIC_RELAXED);
}
kobject::kobject(type t) :
m_handle_count {0},
m_type {t},
m_obj_id {oid_generate(t)}
{
log::spam(logs::objs, "%s[%02lx] created @ 0x%lx", type_name(m_type), m_obj_id, this);
}
kobject::~kobject()
{
log::spam(logs::objs, "%s[%02lx] deleted", type_name(m_type), m_obj_id);
}
const char *
kobject::type_name(type t)
{
return type_names[static_cast<int>(t)];
}
void
kobject::on_no_handles()
{
log::verbose(logs::objs, "Deleting %s[%02lx] on no handles", type_name(m_type), m_obj_id);
delete this;
}
} // namespace obj