| 394 | } |
| 395 | |
| 396 | void* 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 | |
| 442 | void PthreadStaticObjects::DeleteObjects(Loader::Program* program) |
| 443 | { |
no test coverage detected