@@ -29,6 +29,8 @@ namespace sh::core
2929 template <typename T, typename IsSObject = std::enable_if_t <std::is_base_of_v<SObject, T>>>
3030 class SObjWeakPtr ;
3131
32+ class GCObject ;
33+
3234 // / @brief 마크 앤 스윕기반 가비지 컬렉터
3335 class GarbageCollection : public Singleton <GarbageCollection>
3436 {
@@ -45,17 +47,12 @@ namespace sh::core
4547 // / @brief 루트셋으로 지정하는 함수. 루트셋 객체는 참조하고 있는 객체가 없어도 메모리에서 유지된다.
4648 // / @param obj 루트셋으로 지정할 SObject 포인터
4749 SH_CORE_API void SetRootSet (SObject* obj);
48- SH_CORE_API auto GetRootSet () const -> const std::vector<SObject*>&;
49- SH_CORE_API auto GetRootSetCount () const -> uint64_t;
50- // / @brief 해당 프레임마다 가비지 컬렉터를 수행한다.
51- // / @param tick 목표 프레임
52- SH_CORE_API void SetUpdateTick (uint32_t tick);
53- SH_CORE_API auto GetUpdateTick () const -> uint32_t;
54- SH_CORE_API auto GetCurrentTick () const -> uint32_t;
55-
5650 // / @brief 루트셋에서 해당 객체를 제외하는 함수.
5751 // / @param obj SObject 포인터
5852 SH_CORE_API void RemoveRootSet (const SObject* obj);
53+ // / @brief 해당 프레임마다 가비지 컬렉터를 수행한다.
54+ // / @param tick 목표 프레임
55+ SH_CORE_API void SetUpdateTick (uint32_t tick);
5956
6057 // / @brief GC를 갱신하며 지정된 시간이 흐르면 Collect()와 DestroyPendingKillObjs()가 호출 된다.
6158 SH_CORE_API void Update ();
@@ -79,12 +76,19 @@ namespace sh::core
7976 // / @brief 외부에서는 TrackedContainer의 fn함수 내에서만 사용해야 한다.
8077 SH_CORE_API void MarkBFS (std::queue<SObject*>& bfs);
8178
79+ SH_CORE_API void AddGCObject (GCObject& obj);
80+ SH_CORE_API void RemoveGCObject (GCObject& obj);
81+
8282 SH_CORE_API void AddContainerTracking (const TrackedContainer& container);
8383 SH_CORE_API void RemoveContainerTracking (void * containerPtr);
8484
85+ SH_CORE_API auto GetRootSet () const -> const std::vector<SObject*>& { return rootSets; }
86+ SH_CORE_API auto GetRootSetCount () const -> uint64_t { return rootSets.size (); }
87+ SH_CORE_API auto GetTrackedContainerCount () const -> std::size_t { return trackingContainers.size (); }
88+ SH_CORE_API auto GetUpdateTick () const -> uint32_t { return updatePeriodTick; }
89+ SH_CORE_API auto GetCurrentTick () const -> uint32_t { return tick; }
8590 // / @brief 이전에 GC를 수행하는데 걸린 시간(ms)을 반환 하는 함수
8691 SH_CORE_API auto GetElapsedTime () -> uint32_t { return elapseTime; }
87- SH_CORE_API auto GetTrackedContainerCount () const -> std::size_t { return trackingContainers.size (); }
8892
8993 template <typename T>
9094 void AddPointerTracking (SObjWeakPtr<T>& ptr)
@@ -107,10 +111,28 @@ namespace sh::core
107111 if (it != trackingContainers.end ())
108112 trackingContainers.erase (it);
109113 }
114+
115+ template <typename SObjectT, typename Check = std::enable_if_t <std::is_base_of_v<SObject, SObjectT>>>
116+ void PushReferenceObject (SObjectT*& sobjPtr)
117+ {
118+ if (sobjPtr == nullptr )
119+ return ;
120+
121+ if (sobjPtr->IsPendingKill ())
122+ {
123+ sobjPtr = nullptr ;
124+ return ;
125+ }
126+
127+ if constexpr (std::is_const_v<SObjectT>)
128+ refObjs.push_back (const_cast <std::remove_const_t <SObjectT>&>(*sobjPtr));
129+ else
130+ refObjs.push_back (*sobjPtr);
131+ }
110132 private:
111133 SH_CORE_API GarbageCollection ();
112- // / @brief ref가 pendingkill상태면 nullptr로 바꾸고 아니라면 bfs큐에 넣는 함수
113- void TraceRef (SObject*& ref, std::queue<SObject*>& bfs );
134+
135+ void CollectReferenceObjs ( );
114136 void Mark (std::size_t start, std::size_t end);
115137 void MarkProperties (SObject* obj, std::queue<SObject*>& bfs);
116138 void MarkWithMultiThread ();
@@ -125,6 +147,9 @@ namespace sh::core
125147 std::unordered_map<SObject*, std::size_t > rootSetIdx;
126148 std::vector<SObject*> rootSets;
127149 std::vector<SObject*> pendingKillObjs;
150+ std::unordered_map<GCObject*, std::size_t > gcObjIdx;
151+ std::vector<std::reference_wrapper<GCObject>> gcObjs;
152+ std::vector<std::reference_wrapper<SObject>> refObjs;
128153
129154 std::unordered_map<void *, TrackedContainer> trackingContainers; // key = 컨테이너 포인터
130155
@@ -135,7 +160,7 @@ namespace sh::core
135160 uint32_t elapseTime = 0 ;
136161 uint32_t tick = 0 ;
137162 uint32_t updatePeriodTick = 1000 ;
138- bool bContainerIteratorErased = false ;
163+
139164 bool bPendingKill = false ;
140165 };
141166}// namespace
0 commit comments