From 095b6b7728752c9888e470f889505c1cd777af90 Mon Sep 17 00:00:00 2001 From: Ivan Chikish Date: Mon, 10 Jul 2023 04:47:29 +0300 Subject: [PATCH] [orbis-kernel] Fix sys_namedobj_(create|delete) --- orbis-kernel/include/orbis/thread/Process.hpp | 11 +-- orbis-kernel/src/sys/sys_sce.cpp | 80 +++++-------------- 2 files changed, 26 insertions(+), 65 deletions(-) diff --git a/orbis-kernel/include/orbis/thread/Process.hpp b/orbis-kernel/include/orbis/thread/Process.hpp index 5335c5af5..0be7a2a1c 100644 --- a/orbis-kernel/include/orbis/thread/Process.hpp +++ b/orbis-kernel/include/orbis/thread/Process.hpp @@ -17,6 +17,11 @@ struct Thread; struct ProcessOps; struct sysentvec; +struct NamedObjInfo { + void *idptr; + uint16_t ty; +}; + struct Process { KernelContext *context = nullptr; pid_t pid = -1; @@ -43,10 +48,6 @@ struct Process { // Named objects for debugging utils::shared_mutex namedObjMutex; utils::kmap namedObjNames; - utils::OwningIdMap mutexIds; - utils::OwningIdMap condIds; - utils::OwningIdMap rwlockIds; - utils::OwningIdMap barrierIds; - utils::OwningIdMap equeueIds; + utils::OwningIdMap namedObjIds; }; } // namespace orbis diff --git a/orbis-kernel/src/sys/sys_sce.cpp b/orbis-kernel/src/sys/sys_sce.cpp index 70d0c37c7..a686e8afe 100644 --- a/orbis-kernel/src/sys/sys_sce.cpp +++ b/orbis-kernel/src/sys/sys_sce.cpp @@ -303,33 +303,18 @@ orbis::SysResult orbis::sys_namedobj_create(Thread *thread, result != ErrorCode{}) { return result; } - if (type < 0x101 || type > 0x107) - return ErrorCode::INVAL; - - std::lock_guard lock(thread->tproc->namedObjMutex); - if (!thread->tproc->namedObjNames.try_emplace(object, _name).second) { - ORBIS_LOG_FATAL("Named object: pointer colflict", type, object); + if (type < 0x101 || type > 0x104) { + if (type != 0x107) + ORBIS_LOG_ERROR(__FUNCTION__, *name, object, type); } - switch (type) { - case kNamedObjTypeMutex: - thread->retval[0] = thread->tproc->mutexIds.emplace(object).first; - break; - case kNamedObjTypeCond: - thread->retval[0] = thread->tproc->condIds.emplace(object).first; - break; - case kNamedObjTypeRwlock: - thread->retval[0] = thread->tproc->rwlockIds.emplace(object).first; - break; - case kNamedObjTypeBarrier: - thread->retval[0] = thread->tproc->barrierIds.emplace(object).first; - break; - case kNamedObjTypeEqueue: - thread->retval[0] = - thread->tproc->equeueIds.emplace((std::intptr_t)object).first; - break; - default: - std::abort(); + std::lock_guard lock(thread->tproc->namedObjMutex); + auto [id, obj] = thread->tproc->namedObjIds.emplace(object, type); + if (!obj) { + return ErrorCode::AGAIN; + } + if (!thread->tproc->namedObjNames.try_emplace(object, _name).second) { + ORBIS_LOG_ERROR("Named object: pointer colflict", type, object); } return {}; @@ -337,44 +322,19 @@ orbis::SysResult orbis::sys_namedobj_create(Thread *thread, orbis::SysResult orbis::sys_namedobj_delete(Thread *thread, uint16_t id, uint16_t type) { ORBIS_LOG_NOTICE(__FUNCTION__, id, type); - if (id == 0 || type < 0x101 || type > 0x107) + if (id == 0) return ErrorCode::INVAL; + if (type < 0x101 || type > 0x104) { + if (type != 0x107) + ORBIS_LOG_ERROR(__FUNCTION__, id, type); + } std::lock_guard lock(thread->tproc->namedObjMutex); - void *object = nullptr; - switch (type) { - case kNamedObjTypeMutex: - if (auto pobj = thread->tproc->mutexIds.get(id)) - object = *pobj, thread->tproc->mutexIds.destroy(id); - else - return ErrorCode::SRCH; - break; - case kNamedObjTypeCond: - if (auto pobj = thread->tproc->condIds.get(id)) - object = *pobj, thread->tproc->condIds.destroy(id); - else - return ErrorCode::SRCH; - break; - case kNamedObjTypeRwlock: - if (auto pobj = thread->tproc->rwlockIds.get(id)) - object = *pobj, thread->tproc->rwlockIds.destroy(id); - else - return ErrorCode::SRCH; - break; - case kNamedObjTypeBarrier: - if (auto pobj = thread->tproc->barrierIds.get(id)) - object = *pobj, thread->tproc->barrierIds.destroy(id); - else - return ErrorCode::SRCH; - break; - case kNamedObjTypeEqueue: - if (auto pobj = thread->tproc->equeueIds.get(id)) - object = (void *)*pobj, thread->tproc->equeueIds.destroy(id); - else - return ErrorCode::SRCH; - break; - default: - std::abort(); + if (!thread->tproc->namedObjIds.get(id)) + return ErrorCode::SRCH; + auto [object, ty] = *thread->tproc->namedObjIds.get(id); + if (ty != type) { + ORBIS_LOG_ERROR("Named object: found with incorrect type", ty, type); } if (!thread->tproc->namedObjNames.erase(object)) {