MCPcopy Create free account
hub / github.com/InoriRus/Kyty / CreateObject

Method CreateObject

source/emulator/src/Kernel/Pthread.cpp:396–440  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

394}
395
396void* PthreadStaticObjects::CreateObject(void* addr, PthreadStaticObject::Type type)
397{
398 Core::LockGuard lock(m_mutex);
399
400 if (addr == nullptr || *static_cast<void**>(addr) != nullptr)
401 {
402 return addr;
403 }
404
405 auto* rt = Core::Singleton<Loader::RuntimeLinker>::Instance();
406 auto vaddr = reinterpret_cast<uint64_t>(addr);
407 auto* program = rt->FindProgramByAddr(vaddr);
408
409 EXIT_NOT_IMPLEMENTED(program == nullptr);
410
411 auto* obj = new PthreadStaticObject;
412 obj->program = program;
413 obj->type = type;
414 obj->vaddr = vaddr;
415
416 String name = String::FromPrintf("Static%016" PRIx64, vaddr);
417
418 int result = OK;
419 switch (type)
420 {
421 case PthreadStaticObject::Type::Mutex: result = PthreadMutexInit(static_cast<PthreadMutex*>(addr), nullptr, name.C_Str()); break;
422 case PthreadStaticObject::Type::Cond: result = PthreadCondInit(static_cast<PthreadCond*>(addr), nullptr, name.C_Str()); break;
423 case PthreadStaticObject::Type::Rwlock: result = PthreadRwlockInit(static_cast<PthreadRwlock*>(addr), nullptr, name.C_Str()); break;
424 default: EXIT("unknown type: %d\n", static_cast<int>(type));
425 }
426
427 EXIT_NOT_IMPLEMENTED(result != OK);
428
429 auto index = m_objects.Find(nullptr);
430
431 if (m_objects.IndexValid(index))
432 {
433 m_objects[index] = obj;
434 } else
435 {
436 m_objects.Add(obj);
437 }
438
439 return addr;
440}
441
442void PthreadStaticObjects::DeleteObjects(Loader::Program* program)
443{

Calls 4

FindProgramByAddrMethod · 0.80
FindMethod · 0.45
IndexValidMethod · 0.45
AddMethod · 0.45

Tested by

no test coverage detected