summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-03-02 18:09:51 +0100
committerGitHub <noreply@github.com>2025-03-02 18:09:51 +0100
commitc242ff4cbb353d7eb50054044495d2a50f51bc72 (patch)
tree913f2916e501614931a3c59be1c036665bae14c0 /include
parentc2b2d9700c47c1eb4c6026fee14d1d9b247f8fe8 (diff)
parentc7d788117e399bdf7a4001f55f00d12499f128fe (diff)
Merge pull request #120 from robojumper/nand_request_thread
NandRequestThread
Diffstat (limited to 'include')
-rw-r--r--include/egg/core/eggThread.h2
-rw-r--r--include/toBeSorted/nand_request_thread.h140
-rw-r--r--include/toBeSorted/tlist.h10
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;
};