feat(runtime): atomically replace collision generations
This commit is contained in:
parent
99bf1751bb
commit
9b0f59bd1b
21 changed files with 2435 additions and 408 deletions
|
|
@ -1750,8 +1750,6 @@ public sealed class RuntimeSetPositionStateTests
|
|||
RuntimePlacementProjectionSnapshot placed = observer.Deltas[^1].Placement;
|
||||
Assert.Equal(RuntimePlacementProjectionKind.Place, placed.Kind);
|
||||
Assert.Equal(DestinationIndoorCell, placed.Token.ExactCellId);
|
||||
Assert.True(lifetime.Physics.SetPosition.AcknowledgeProjection(
|
||||
placed.Token));
|
||||
RuntimePhysicsOwnershipSnapshot final = lifetime.Physics.CaptureOwnership();
|
||||
Assert.Equal(0, final.DeferredSetPositionBucketCount);
|
||||
Assert.Equal(0, final.UnboundDeferredSetPositionCellCount);
|
||||
|
|
@ -1872,10 +1870,6 @@ public sealed class RuntimeSetPositionStateTests
|
|||
Assert.All(observer.Deltas, delta => Assert.Equal(
|
||||
RuntimePlacementProjectionKind.Place,
|
||||
delta.Placement.Kind));
|
||||
Assert.True(lifetime.Physics.SetPosition.AcknowledgeProjection(
|
||||
observer.Deltas[0].Placement.Token));
|
||||
Assert.True(lifetime.Physics.SetPosition.AcknowledgeProjection(
|
||||
observer.Deltas[1].Placement.Token));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
|
|
@ -2425,32 +2419,48 @@ public sealed class RuntimeSetPositionStateTests
|
|||
RuntimeCollisionAdmission admission,
|
||||
PreparedLandblockCollisionGeneration prepared)
|
||||
{
|
||||
while (true)
|
||||
bool engineCommitted = false;
|
||||
for (int poll = 0; poll < 10_000; poll++)
|
||||
{
|
||||
while (!physics.AdvanceCollisionRetainedOwnerCapture(
|
||||
admission,
|
||||
prepared).Completed)
|
||||
if (!engineCommitted)
|
||||
{
|
||||
while (!physics.AdvanceCollisionRetainedOwnerCapture(
|
||||
admission,
|
||||
prepared).Completed)
|
||||
{
|
||||
}
|
||||
foreach (uint ownerId in prepared.RetainedOwnerIds)
|
||||
{
|
||||
physics.RefreshCollisionRetainedOwner(
|
||||
admission,
|
||||
prepared,
|
||||
ownerId);
|
||||
}
|
||||
RuntimeCollisionSealStep seal;
|
||||
do
|
||||
{
|
||||
seal = physics.AdvanceCollisionGenerationSeal(
|
||||
admission,
|
||||
prepared);
|
||||
}
|
||||
while (!seal.Completed && !seal.Restarted);
|
||||
if (!seal.Completed)
|
||||
continue;
|
||||
}
|
||||
foreach (uint ownerId in prepared.RetainedOwnerIds)
|
||||
RuntimeCollisionGenerationCommit result =
|
||||
physics.CommitCollisionGeneration(admission, prepared);
|
||||
if (result.Completed)
|
||||
return result;
|
||||
while (physics.SetPosition.TryPeekProjection(
|
||||
out RuntimePlacementProjectionSnapshot projection))
|
||||
{
|
||||
physics.RefreshCollisionRetainedOwner(
|
||||
admission,
|
||||
prepared,
|
||||
ownerId);
|
||||
Assert.True(physics.SetPosition.AcknowledgeProjection(
|
||||
projection.Token));
|
||||
}
|
||||
RuntimeCollisionSealStep seal;
|
||||
do
|
||||
{
|
||||
seal = physics.AdvanceCollisionGenerationSeal(
|
||||
admission,
|
||||
prepared);
|
||||
}
|
||||
while (!seal.Completed && !seal.Restarted);
|
||||
if (seal.Completed)
|
||||
break;
|
||||
engineCommitted = result.EngineCommitted;
|
||||
}
|
||||
return physics.CommitCollisionGeneration(admission, prepared);
|
||||
throw new InvalidOperationException(
|
||||
"Collision generation did not complete its Runtime mutation transaction.");
|
||||
}
|
||||
|
||||
private static void AddSyntheticCell(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue