mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-04-05 14:37:08 +00:00
[orbis-kernel] Initial rfork implementation
This commit is contained in:
parent
058c746ac1
commit
e9897441fe
17 changed files with 294 additions and 50 deletions
|
|
@ -659,7 +659,7 @@ SysResult sys_opmc_get_ctr(Thread *thread /* TODO */);
|
|||
SysResult sys_budget_create(Thread *thread /* TODO */);
|
||||
SysResult sys_budget_delete(Thread *thread /* TODO */);
|
||||
SysResult sys_budget_get(Thread *thread /* TODO */);
|
||||
SysResult sys_budget_set(Thread *thread /* TODO */);
|
||||
SysResult sys_budget_set(Thread *thread, slong budget);
|
||||
SysResult sys_virtual_query(Thread *thread, ptr<void> addr, uint64_t unk,
|
||||
ptr<void> info, size_t infosz);
|
||||
SysResult sys_mdbg_call(Thread *thread /* TODO */);
|
||||
|
|
|
|||
|
|
@ -39,4 +39,6 @@ struct Thread {
|
|||
void incRef() {}
|
||||
void decRef() {}
|
||||
};
|
||||
|
||||
extern thread_local Thread *g_currentThread;
|
||||
} // namespace orbis
|
||||
|
|
|
|||
|
|
@ -33,6 +33,16 @@ class RcIdMap {
|
|||
}
|
||||
}
|
||||
|
||||
bool insert(std::size_t index, T *object) {
|
||||
if (mask.test(index)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
mask.set(index);
|
||||
objects[index] = object;
|
||||
return true;
|
||||
}
|
||||
|
||||
std::size_t insert(T *object) {
|
||||
std::size_t index = mask.countr_one();
|
||||
mask.set(index);
|
||||
|
|
@ -117,6 +127,28 @@ public:
|
|||
end_iterator end() const { return {}; }
|
||||
|
||||
private:
|
||||
bool insert_impl(IdT id, T *object) {
|
||||
std::lock_guard lock(mutex);
|
||||
|
||||
auto raw = static_cast<std::size_t>(id);
|
||||
auto page = (raw - MinId) / ChunkSize;
|
||||
auto index = (raw - MinId) % ChunkSize;
|
||||
|
||||
if (page >= ChunkCount) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_chunks[page].insert(index, object)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_chunks[page].mask.full()) {
|
||||
m_fullChunks.set(page);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
IdT insert_impl(T *object) {
|
||||
std::lock_guard lock(mutex);
|
||||
|
||||
|
|
@ -159,7 +191,29 @@ public:
|
|||
return result;
|
||||
}
|
||||
|
||||
T *get(IdT id) {
|
||||
bool insert(IdT id, T *object) {
|
||||
if (insert_impl(id, object)) {
|
||||
object->incRef();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool insert(IdT id, const Ref<T> &ref) { return insert(id, ref.get()); }
|
||||
|
||||
bool insert(IdT id, Ref<T> &&ref) {
|
||||
auto object = ref.release();
|
||||
|
||||
if (!insert_impl(id, object)) {
|
||||
object->decRef();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Ref<T> get(IdT id) {
|
||||
const auto rawId = static_cast<std::size_t>(id) - MinId;
|
||||
|
||||
if (rawId >= MaxId - MinId) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue