summaryrefslogtreecommitdiff
path: root/src/KingSystem/ActorSystem/actBaseProcJobQue.h
blob: 8e8fd35fe1da8c4b2f6a25e5876fec31a1229b2f (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
#pragma once

#include <agl/utl/aglAtomicPtrArray.h>
#include <array>
#include <basis/seadTypes.h>
#include <container/seadSafeArray.h>
#include <mc/seadJob.h>
#include <mc/seadJobQueue.h>
#include <thread/seadAtomic.h>
#include "KingSystem/ActorSystem/actBaseProcJob.h"
#include "KingSystem/Utils/Types.h"

namespace sead {
class WorkerMgr;
}

namespace ksys::act {

class BaseProcJobQue {
public:
    BaseProcJobQue();
    BaseProcJobQue(const BaseProcJobQue&) = delete;
    auto operator=(const BaseProcJobQue&) = delete;
    virtual ~BaseProcJobQue();

    void init(sead::Heap* heap);
    bool pushJobQueue(sead::WorkerMgr* worker_mgr, BaseProcJobLists* lists, int priority,
                      JobType type);
    bool pushExtraJobs(sead::FixedSizeJQ* queue, BaseProcJobLists* lists, int priority,
                       JobType type);
    bool pushExtraJobs(sead::FixedSizeJQ* queue,
                       const agl::utl::AtomicPtrArray<BaseProcJobLink>& links);

    void clear() { mNumExtraJobs = 0; }

private:
    bool pushJobs(sead::FixedSizeJQ* queue, BaseProcJobLists* lists, int priority,
                  bool should_reset_job_idx, JobType type);
    bool isIndexValid(int idx) const { return u32(idx) < u32(mPool.size()); }

    int mFreeJobIdx = 0;
    sead::FixedSizeJQ mJobQueue;
    sead::SafeArray<BaseProcJob, 1200> mPool;
    sead::Atomic<int> mNumExtraJobs = 0;
};
KSYS_CHECK_SIZE_NX150(BaseProcJobQue, 0xbc38);

}  // namespace ksys::act