diff options
| author | robojumper <robojumper@gmail.com> | 2025-03-02 18:09:51 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-02 18:09:51 +0100 |
| commit | c242ff4cbb353d7eb50054044495d2a50f51bc72 (patch) | |
| tree | 913f2916e501614931a3c59be1c036665bae14c0 /include | |
| parent | c2b2d9700c47c1eb4c6026fee14d1d9b247f8fe8 (diff) | |
| parent | c7d788117e399bdf7a4001f55f00d12499f128fe (diff) | |
Merge pull request #120 from robojumper/nand_request_thread
NandRequestThread
Diffstat (limited to 'include')
| -rw-r--r-- | include/egg/core/eggThread.h | 2 | ||||
| -rw-r--r-- | include/toBeSorted/nand_request_thread.h | 140 | ||||
| -rw-r--r-- | include/toBeSorted/tlist.h | 10 |
3 files changed, 151 insertions, 1 deletions
diff --git a/include/egg/core/eggThread.h b/include/egg/core/eggThread.h index 9b6c4564..87b56ab9 100644 --- a/include/egg/core/eggThread.h +++ b/include/egg/core/eggThread.h @@ -28,7 +28,7 @@ public: /* 0x38 */ u32 mStackSize; /* 0x3C */ Heap *mAllocatableHeap; // TODO from the usage in eggThread this really looks like - // it's stashed thread that's restored when switching threads + // it's a stashed heap that's restored when switching threads /* 0x40 */ Heap *mCurrentHeap; /* 0x44 */ nw4r::ut::Node mLink; diff --git a/include/toBeSorted/nand_request_thread.h b/include/toBeSorted/nand_request_thread.h new file mode 100644 index 00000000..7b96c3fe --- /dev/null +++ b/include/toBeSorted/nand_request_thread.h @@ -0,0 +1,140 @@ +#ifndef NAND_REQUEST_H +#define NAND_REQUEST_H + +#include "common.h" +#include "egg/core/eggHeap.h" +#include "egg/core/eggThread.h" +#include "rvl/NAND/nand.h" +#include "rvl/OS/OSMessage.h" +#include "rvl/OS/OSMutex.h" +#include "sized_string.h" +#include "toBeSorted/tlist.h" + +struct NandRequest { + NandRequest() : mStatus(NAND_RESULT_BUSY), bHandled(false) {} + ~NandRequest() {} + virtual bool execute() = 0; + + /* 0x04 */ TListNode<NandRequest> mNode; + /* 0x0C */ NANDResult mStatus; + /* 0x10 */ bool bHandled; + + static void *operator new(size_t size); + static void free(NandRequest *); + + NANDResult getStatus() const; +}; + +struct NandRequestCheck : public NandRequest { + NandRequestCheck(u32 neededBlocks, u32 neededFiles); + + virtual bool execute() override; + + /* 0x14 */ u32 mNeededBlocks; + /* 0x18 */ u32 mNeededFiles; + /* 0x1C */ u32 mResult; +}; + +struct NandRequestCreate : public NandRequest { + NandRequestCreate(const char *filePath, u8 perm, u8 attr); + + virtual bool execute() override; + + // cursed offsets + /* 0x11 */ SizedString<64> mFilePath; + /* 0x51 */ u8 mPerm; + /* 0x52 */ u8 mAttr; +}; + +struct NandRequestWrite : public NandRequest { + NandRequestWrite(const char *str, void *data, size_t dataSize); + + virtual bool execute() override; + + /* 0x11 */ SizedString<64> mFilePath; + /* 0x54 */ void *mData; + /* 0x58 */ size_t mDataSize; + /* 0x5C */ bool mFailedWrite; +}; + +struct NandRequestHolderBase { + NandRequestHolderBase(NandRequest *req) : mpRequest(req) {} + NandRequest *mpRequest; + + bool isCompleted() const; + NANDResult getStatus() const; + bool runToCompletion(); +}; + +struct NandRequestCheckHolder : public NandRequestHolderBase { + NandRequestCheckHolder(NandRequestCheck *req) : NandRequestHolderBase(req) {} + + bool check(u32 neededBlocks, u32 neededFiles); + u32 getCheckResult(); +}; + +struct NandRequestCreateHolder : public NandRequestHolderBase { + NandRequestCreateHolder(NandRequestCreate *req) : NandRequestHolderBase(req) {} + + bool create(const char *filePath, u8 perm, u8 attr); +}; + +struct NandRequestWriteHolder : public NandRequestHolderBase { + NandRequestWriteHolder(NandRequestWrite *req) : NandRequestHolderBase(req) {} + bool failedWrite(); + + bool write(const char *filePath, void *data, size_t dataSize); +}; + +class NandRequestThread : EGG::Thread { + friend NandRequest; + +public: + NandRequestThread( + int priority, EGG::Heap *commandHeap, void *bufFromGameHeap, size_t bufSize, void *mThreadArg, EGG::Heap *heap + ); + virtual ~NandRequestThread(); + + virtual void *run() override; + void enqueueRequest(NandRequest *request); + NandRequest *dequeueRequest(); + + static NandRequestThread *create( + int priority, EGG::Heap *commandHeap, void *bufFromGameHeap, size_t bufSize, void *mThreadArg, EGG::Heap *heap + ); + + static NandRequestThread *getInstance() { + return sInstance; + } + + void *getBuf() { + return mBufFromGameHeap; + } + + size_t getBufSize() { + return mBufSize; + } + + NandRequestCheck *checkRequest(u32 neededBlocks, u32 neededFiles); + NandRequestCreate *createRequest(const char *filePath, u8 perm, u8 attr); + NandRequestWrite *writeRequest(const char *filePath, void *data, size_t dataSize); + +private: + typedef TList<NandRequest, offsetof(NandRequest, mNode)> NandRequestList; + static NandRequestThread *sInstance; + + bool waitForMessage(); + void sendMessage(); + + u8 field_0x4C[0x368 - 0x4C]; + /* 0x368 */ OSMessageQueue mMessageQueue; + /* 0x388 */ OSMessage mMessageBuffer; + /* 0x38C */ OSMutex mMutex; + /* 0x3A4 */ NandRequestList mRequestList; + /* 0x3B0 */ EGG::Heap *mpCommandHeap; + /* 0x3B4 */ void *mBufFromGameHeap; + /* 0x3B8 */ size_t mBufSize; + /* 0x3BC */ UNKWORD field_0x3BC; +}; + +#endif diff --git a/include/toBeSorted/tlist.h b/include/toBeSorted/tlist.h index bcb6b1ed..3fae072e 100644 --- a/include/toBeSorted/tlist.h +++ b/include/toBeSorted/tlist.h @@ -124,6 +124,16 @@ public: mCount--; } + T* GetFirst() { + return GetPtrFromNode(&mStartEnd); + } + + void RemoveFirst() { + if (mCount != 0) { + remove(GetFirst()); + } + } + TNode mStartEnd; s32 mCount; }; |
