55#include < ComHelpers.h>
66#include < unordered_map>
77#include < list>
8+ #include < mutex>
89#include < inspectable.h>
910
1011namespace API
@@ -315,12 +316,16 @@ namespace
315316 class TrackerRuntimeManagerImpl : public API ::IReferenceTrackerManager
316317 {
317318 ComSmartPtr<API::IReferenceTrackerHost> _runtimeServices;
319+ std::mutex _objectsLock;
318320 std::list<ComSmartPtr<TrackerObject>> _objects;
319321
320322 public:
321323 ITrackerObject* RecordObject (_In_ TrackerObject* obj, _Outptr_ IUnknown** inner)
322324 {
323- _objects.push_back (ComSmartPtr<TrackerObject>{ obj });
325+ {
326+ std::lock_guard<std::mutex> guard{ _objectsLock };
327+ _objects.push_back (ComSmartPtr<TrackerObject>{ obj });
328+ }
324329
325330 if (_runtimeServices != nullptr )
326331 _runtimeServices->AddMemoryPressure (sizeof (TrackerObject));
@@ -337,12 +342,17 @@ namespace
337342
338343 void ReleaseObjects ()
339344 {
345+ std::list<ComSmartPtr<TrackerObject>> objectsLocal;
346+ {
347+ std::lock_guard<std::mutex> guard{ _objectsLock };
348+ objectsLocal = std::move (_objects);
349+ }
350+
340351 // Unpeg all instances
341- for (auto & i : _objects )
352+ for (auto & i : objectsLocal )
342353 (void )i->DisconnectFromReferenceTrackerRuntime ();
343354
344- size_t count = _objects.size ();
345- _objects.clear ();
355+ size_t count = objectsLocal.size ();
346356 if (_runtimeServices != nullptr )
347357 _runtimeServices->RemoveMemoryPressure (sizeof (TrackerObject) * count);
348358 }
@@ -358,6 +368,8 @@ namespace
358368 public: // IReferenceTrackerManager
359369 STDMETHOD (ReferenceTrackingStarted)()
360370 {
371+ std::lock_guard<std::mutex> guard{ _objectsLock };
372+
361373 // Unpeg all instances
362374 for (auto & i : _objects)
363375 i->TogglePeg (/* should peg */ false );
@@ -367,6 +379,8 @@ namespace
367379
368380 STDMETHOD (FindTrackerTargetsCompleted)(_In_ BOOL bWalkFailed)
369381 {
382+ std::lock_guard<std::mutex> guard{ _objectsLock };
383+
370384 // Verify and ensure all connected types are pegged
371385 for (auto & i : _objects)
372386 i->TogglePeg (/* should peg */ true );
0 commit comments