Implement a factory for kernel objects.

Couldn't think of a better way to do this, maybe there's some fancy
one I don't know about.

Also finished up a couple left over kernel objects.

Maybe a quarter the way there?
This commit is contained in:
Unknown W. Brackets
2012-12-28 13:55:22 -08:00
parent d9efdf548b
commit 595759ef78
26 changed files with 304 additions and 17 deletions
+50
View File
@@ -113,6 +113,18 @@ public:
static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_CBID; }
int GetIDType() const { return SCE_KERNEL_TMID_Callback; }
virtual void DoState(PointerWrap &p)
{
p.Do(nc);
p.Do(savedPC);
p.Do(savedRA);
p.Do(savedV0);
p.Do(savedV1);
p.Do(savedIdRegister);
p.Do(forceDelete);
p.DoMarker("Callback");
}
NativeCallback nc;
u32 savedPC;
@@ -297,6 +309,34 @@ public:
bool isWaiting() const { return (nt.status & THREADSTATUS_WAIT) != 0; }
bool isSuspended() const { return (nt.status & THREADSTATUS_SUSPEND) != 0; }
virtual void DoState(PointerWrap &p)
{
p.Do(nt);
p.Do(waitInfo);
p.Do(sleeping);
p.Do(moduleId);
p.Do(isProcessingCallbacks);
p.Do(currentCallbackId);
p.Do(context);
u32 numCallbacks = THREAD_CALLBACK_NUM_TYPES;
p.Do(numCallbacks);
if (numCallbacks != THREAD_CALLBACK_NUM_TYPES)
ERROR_LOG(HLE, "Unable to load state: different kernel object storage.");
for (size_t i = 0; i < THREAD_CALLBACK_NUM_TYPES; ++i)
{
std::set<SceUID>::iterator it, end;
p.Do(registeredCallbacks[i]);
p.Do(readyCallbacks[i]);
}
p.Do(pendingMipsCalls);
p.Do(stackBlock);
p.DoMarker("Thread");
}
NativeThread nt;
ThreadWaitInfo waitInfo;
@@ -409,6 +449,16 @@ void __KernelThreadingInit()
__KernelListenThreadEnd(__KernelCancelWakeup);
}
KernelObject *__KernelThreadObject()
{
return new Thread;
}
KernelObject *__KernelCallbackObject()
{
return new Callback;
}
void __KernelListenThreadEnd(ThreadCallback callback)
{
threadEndListeners.push_back(callback);