Skip to content

Commit 57bbdee

Browse files
Race condition in Mock reference tracker runtime with GC. (#50804)
1 parent f6b344b commit 57bbdee

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

src/tests/Interop/COM/ComWrappers/MockReferenceTrackerRuntime/ReferenceTrackerRuntime.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <ComHelpers.h>
66
#include <unordered_map>
77
#include <list>
8+
#include <mutex>
89
#include <inspectable.h>
910

1011
namespace 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

Comments
 (0)