Skip to content

Commit

Permalink
fix: acquire a lock in a callback to avoid data race (#1328)
Browse files Browse the repository at this point in the history
* fix: aquire a lock in a callback to avoid data race

* fix: fix a NullReferenceException error that occurs when the result is empty
  • Loading branch information
homuler authored Feb 17, 2025
1 parent 04b46f4 commit acbb6ed
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,7 @@ private static Tasks.Core.TaskRunner.PacketsCallback BuildPacketsCallback(FaceDe
return null;
}

var lockObj = new object();
var result = FaceDetectionResult.Alloc(options.numFaces);

return (PacketMap outputPackets) =>
Expand All @@ -259,13 +260,16 @@ private static Tasks.Core.TaskRunner.PacketsCallback BuildPacketsCallback(FaceDe
using var image = outImagePacket.Get();
var timestamp = outImagePacket.TimestampMicroseconds() / _MICRO_SECONDS_PER_MILLISECOND;

if (TryBuildFaceDetectorResult(outputPackets, ref result))
lock (lockObj)
{
resultCallback(result, image, timestamp);
}
else
{
resultCallback(default, image, timestamp);
if (TryBuildFaceDetectorResult(outputPackets, ref result))
{
resultCallback(result, image, timestamp);
}
else
{
resultCallback(default, image, timestamp);
}
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,7 @@ private static Tasks.Core.TaskRunner.PacketsCallback BuildPacketsCallback(FaceLa
return null;
}

var lockObj = new object();
var faceLandmarkerResult = FaceLandmarkerResult.Alloc(options.numFaces, options.outputFaceBlendshapes, options.outputFaceTransformationMatrixes);

return (PacketMap outputPackets) =>
Expand All @@ -270,13 +271,16 @@ private static Tasks.Core.TaskRunner.PacketsCallback BuildPacketsCallback(FaceLa
using var image = outImagePacket.Get();
var timestamp = outImagePacket.TimestampMicroseconds() / _MICRO_SECONDS_PER_MILLISECOND;

if (TryBuildFaceLandmarkerResult(outputPackets, faceGeometriesForRead, ref faceLandmarkerResult))
lock (lockObj)
{
resultCallback(faceLandmarkerResult, image, timestamp);
}
else
{
resultCallback(default, image, timestamp);
if (TryBuildFaceLandmarkerResult(outputPackets, faceGeometriesForRead, ref faceLandmarkerResult))
{
resultCallback(faceLandmarkerResult, image, timestamp);
}
else
{
resultCallback(default, image, timestamp);
}
}
};
}
Expand All @@ -303,7 +307,7 @@ private static bool TryBuildFaceLandmarkerResult(PacketMap outputPackets,
}

var faceLandmarks = result.faceLandmarks ?? new List<NormalizedLandmarks>();
faceLandmarksPacket.Get(result.faceLandmarks);
faceLandmarksPacket.Get(faceLandmarks);

var faceBlendshapesList = result.faceBlendshapes;
using var faceBlendshapesPacket = outputPackets.At<List<Classifications>>(_BLENDSHAPES_STREAM_NAME);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,7 @@ private static Tasks.Core.TaskRunner.PacketsCallback BuildPacketsCallback(HandLa
return null;
}

var lockObj = new object();
var handLandmarkerResult = HandLandmarkerResult.Alloc(options.numHands);

return (PacketMap outputPackets) =>
Expand All @@ -251,13 +252,16 @@ private static Tasks.Core.TaskRunner.PacketsCallback BuildPacketsCallback(HandLa
using var image = outImagePacket.Get();
var timestamp = outImagePacket.TimestampMicroseconds() / _MICRO_SECONDS_PER_MILLISECOND;

if (TryBuildHandLandmarkerResult(outputPackets, ref handLandmarkerResult))
lock (lockObj)
{
resultCallback(handLandmarkerResult, image, timestamp);
}
else
{
resultCallback(default, image, timestamp);
if (TryBuildHandLandmarkerResult(outputPackets, ref handLandmarkerResult))
{
resultCallback(handLandmarkerResult, image, timestamp);
}
else
{
resultCallback(default, image, timestamp);
}
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,7 @@ private static Tasks.Core.TaskRunner.PacketsCallback BuildPacketsCallback(Holist
return null;
}

var lockObj = new object();
var holisticLandmarkerResult = new HolisticLandmarkerResult();

return (PacketMap outputPackets) =>
Expand All @@ -260,13 +261,16 @@ private static Tasks.Core.TaskRunner.PacketsCallback BuildPacketsCallback(Holist
using var image = outImagePacket.Get();
var timestamp = outImagePacket.TimestampMicroseconds() / _MICRO_SECONDS_PER_MILLISECOND;

if (TryBuildHolisticLandmarkerResult(outputPackets, ref holisticLandmarkerResult))
lock (lockObj)
{
resultCallback(in holisticLandmarkerResult, image, timestamp);
}
else
{
resultCallback(default, image, timestamp);
if (TryBuildHolisticLandmarkerResult(outputPackets, ref holisticLandmarkerResult))
{
resultCallback(in holisticLandmarkerResult, image, timestamp);
}
else
{
resultCallback(default, image, timestamp);
}
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,7 @@ private static Tasks.Core.TaskRunner.PacketsCallback BuildPacketsCallback(ImageS
return null;
}

var lockObj = new object();
var segmentationResult = ImageSegmenterResult.Alloc(options.outputConfidenceMasks);

return (PacketMap outputPackets) =>
Expand All @@ -269,13 +270,16 @@ private static Tasks.Core.TaskRunner.PacketsCallback BuildPacketsCallback(ImageS
using var image = outImagePacket.Get();
var timestamp = outImagePacket.TimestampMicroseconds() / _MICRO_SECONDS_PER_MILLISECOND;

if (TryBuildImageSegmenterResult(outputPackets, ref segmentationResult))
lock (lockObj)
{
resultCallback(segmentationResult, image, timestamp);
}
else
{
resultCallback(default, image, timestamp);
if (TryBuildImageSegmenterResult(outputPackets, ref segmentationResult))
{
resultCallback(segmentationResult, image, timestamp);
}
else
{
resultCallback(default, image, timestamp);
}
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,7 @@ private static Tasks.Core.TaskRunner.PacketsCallback BuildPacketsCallback(Object
return null;
}

var lockObj = new object();
var result = ObjectDetectorResult.Alloc(Math.Max(options.maxResults ?? 0, 0));

return (PacketMap outputPackets) =>
Expand All @@ -260,13 +261,16 @@ private static Tasks.Core.TaskRunner.PacketsCallback BuildPacketsCallback(Object
using var image = outImagePacket.Get();
var timestamp = outImagePacket.TimestampMicroseconds() / _MICRO_SECONDS_PER_MILLISECOND;

if (TryBuildObjectDetectorResult(outputPackets, ref result))
lock (lockObj)
{
resultCallback(result, image, timestamp);
}
else
{
resultCallback(default, image, timestamp);
if (TryBuildObjectDetectorResult(outputPackets, ref result))
{
resultCallback(result, image, timestamp);
}
else
{
resultCallback(default, image, timestamp);
}
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,7 @@ private static Tasks.Core.TaskRunner.PacketsCallback BuildPacketsCallback(PoseLa
return null;
}

var lockObj = new object();
var poseLandmarkerResult = PoseLandmarkerResult.Alloc(options.numPoses, options.outputSegmentationMasks);

return (PacketMap outputPackets) =>
Expand All @@ -251,13 +252,16 @@ private static Tasks.Core.TaskRunner.PacketsCallback BuildPacketsCallback(PoseLa
using var image = outImagePacket.Get();
var timestamp = outImagePacket.TimestampMicroseconds() / _MICRO_SECONDS_PER_MILLISECOND;

if (TryBuildPoseLandmarkerResult(outputPackets, ref poseLandmarkerResult))
lock (lockObj)
{
resultCallback(poseLandmarkerResult, image, timestamp);
}
else
{
resultCallback(default, image, timestamp);
if (TryBuildPoseLandmarkerResult(outputPackets, ref poseLandmarkerResult))
{
resultCallback(poseLandmarkerResult, image, timestamp);
}
else
{
resultCallback(default, image, timestamp);
}
}
};
}
Expand Down

0 comments on commit acbb6ed

Please sign in to comment.