citra-emu
/
citra-canary
Archived
1
0
Fork 0

SVC: Implemented GetThreadId.

For now threads are using their Handle value as their Id, it should not really cause any problems because Handle values are unique in Citra, but it should be changed. I left a ToDo there because this is not correct behavior as per hardware.
This commit is contained in:
Subv 2014-12-03 23:22:06 -05:00
parent 63b1453dd8
commit 029ff9f1fd
3 changed files with 24 additions and 4 deletions

View File

@ -49,6 +49,8 @@ public:
ThreadContext context; ThreadContext context;
u32 thread_id;
u32 status; u32 status;
u32 entry_point; u32 entry_point;
u32 stack_top; u32 stack_top;
@ -325,6 +327,9 @@ Thread* CreateThread(Handle& handle, const char* name, u32 entry_point, s32 prio
thread_queue.push_back(handle); thread_queue.push_back(handle);
thread_ready_queue.prepare(priority); thread_ready_queue.prepare(priority);
// TODO(Subv): Assign valid ids to each thread, they are much lower than handle values
// they appear to begin at 276 and continue from there
thread->thread_id = handle;
thread->status = THREADSTATUS_DORMANT; thread->status = THREADSTATUS_DORMANT;
thread->entry_point = entry_point; thread->entry_point = entry_point;
thread->stack_top = stack_top; thread->stack_top = stack_top;
@ -465,6 +470,17 @@ void Reschedule() {
} }
} }
ResultCode GetThreadId(u32* thread_id, Handle handle) {
Thread* thread = g_object_pool.Get<Thread>(handle);
if (thread == nullptr)
return ResultCode(ErrorDescription::InvalidHandle, ErrorModule::OS,
ErrorSummary::WrongArgument, ErrorLevel::Permanent);
*thread_id = thread->thread_id;
return RESULT_SUCCESS;
}
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
void ThreadingInit() { void ThreadingInit() {

View File

@ -58,6 +58,9 @@ void Reschedule();
/// Stops the current thread /// Stops the current thread
ResultCode StopThread(Handle thread, const char* reason); ResultCode StopThread(Handle thread, const char* reason);
// Retrieves the thread id of the specified thread handle
ResultCode GetThreadId(u32* thread_id, Handle handle);
/// Resumes a thread from waiting by marking it as "ready" /// Resumes a thread from waiting by marking it as "ready"
void ResumeThreadFromWait(Handle handle); void ResumeThreadFromWait(Handle handle);

View File

@ -281,10 +281,11 @@ static Result ReleaseMutex(Handle handle) {
return res.raw; return res.raw;
} }
/// Get current thread ID /// Get the ID for the specified thread.
static Result GetThreadId(u32* thread_id, Handle thread) { static Result GetThreadId(u32* thread_id, Handle handle) {
ERROR_LOG(SVC, "(UNIMPLEMENTED) called thread=0x%08X", thread); DEBUG_LOG(SVC, "called thread=0x%08X", handle);
return 0; ResultCode result = Kernel::GetThreadId(thread_id, handle);
return result.raw;
} }
/// Query memory /// Query memory