summaryrefslogtreecommitdiff
path: root/src/KingSystem/ActorSystem/actBaseProcInitializer.h
blob: 649e0002171d1cb69ac6a00b0d8a503c5a3b9e8c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#pragma once

#include <basis/seadTypes.h>
#include <container/seadBuffer.h>
#include <prim/seadSafeString.h>
#include "KingSystem/Utils/Thread/TaskQueueBase.h"
#include "KingSystem/Utils/Types.h"

namespace sead {
class Heap;
}

namespace ksys::util {
class TaskMgr;
class TaskQueue;
class TaskThread;
}  // namespace ksys::util

namespace ksys::act {

class BaseProc;
struct BaseProcCreateRequest;

struct BaseProcInitializerArgs {
    u32 queue_size;
    sead::SafeString thread_name = "BaseProcCreate";
    util::TaskSelectionDelegate* task_selector = nullptr;
};

class BaseProcInitializer {
public:
    struct ThreadInfo {
        bool valid = false;
        util::TaskThread* thread = nullptr;
        sead::FixedSafeString<32> thread_name;
    };
    KSYS_CHECK_SIZE_NX150(ThreadInfo, 0x48);

    BaseProcInitializer();
    virtual ~BaseProcInitializer();

    BaseProcInitializer(const BaseProcInitializer&) = delete;
    BaseProcInitializer(BaseProcInitializer&&) = delete;
    auto operator=(const BaseProcInitializer&) = delete;
    auto operator=(BaseProcInitializer&&) = delete;

    const sead::Buffer<ThreadInfo>& getThreads() const { return mThreads; }

    bool isActorGenerationEnabled() const { return mActorGenerationEnabled; }

    void init(sead::Heap* parent_heap, const BaseProcInitializerArgs& args);
    void deleteThreadIfPaused();

    bool requestCreateBaseProc(const BaseProcCreateRequest& req);
    BaseProc* createBaseProc(const BaseProcCreateRequest& req);

    void restartThreads();
    void blockPendingTasks();
    void pauseThreads();
    void resumeThreads();
    void unblockPendingTasks();

    void pauseMainThread();
    void resumeMainThread();

    bool isAnyThreadActive() const;
    void waitForTaskQueuesToEmpty();
    void cancelTasks();
    int getQueueSize(int x = -1) const;

    void removeTasksIf(sead::IDelegate1R<util::Task*, bool>& predicate);
    void setActorGenerationEnabled(bool enabled);

    util::TaskQueue* getTaskQueue() const { return mTaskQueue; }

private:
    sead::Buffer<ThreadInfo> mThreads;
    util::TaskMgr* mTaskMgr = nullptr;
    util::TaskQueue* mTaskQueue = nullptr;
    sead::Heap* mHeap = nullptr;
    bool mActorGenerationEnabled = true;
};
KSYS_CHECK_SIZE_NX150(BaseProcInitializer, 0x38);

}  // namespace ksys::act