Skip to content

Commit

Permalink
Merge pull request #33 from Cysharp/feature/ManualLogicLooperCurrent
Browse files Browse the repository at this point in the history
LogicLooper.Current also returns an instance when running in ManualLogicLooper
  • Loading branch information
mayuki committed May 2, 2024
2 parents 732632e + f288890 commit 11f2aa9
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 12 deletions.
15 changes: 11 additions & 4 deletions src/LogicLooper/LogicLooper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,18 @@ public sealed class LogicLooper : ILogicLooper, IDisposable
private static int _looperSequence = 0;

[ThreadStatic]
private static LogicLooper? _threadLocalLooper = default;
private static ILogicLooper? _threadLocalLooper = default;

/// <summary>
/// Gets a looper of the current thread.
/// </summary>
public static LogicLooper? Current => _threadLocalLooper;
public static ILogicLooper? Current
{
get => _threadLocalLooper;

// NOTE: Setter to set from ManualLogicLooper for testing purposes
internal set => _threadLocalLooper = value;
}

private readonly int _looperId;
private readonly Thread _runLoopThread;
Expand Down Expand Up @@ -235,8 +241,9 @@ private Task RegisterActionAsyncCore(LooperAction action)

private static void StartRunLoop(object? state)
{
_threadLocalLooper = ((LogicLooper)state!);
_threadLocalLooper.RunLoop();
var logicLooper = ((LogicLooper)state!);
_threadLocalLooper = logicLooper;
logicLooper.RunLoop();
}

private void RunLoop()
Expand Down
25 changes: 17 additions & 8 deletions src/LogicLooper/ManualLogicLooper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,20 +62,29 @@ public bool Tick()
var completed = new List<LogicLooper.LooperAction>();
lock (_actions)
{
foreach (var action in _actions.ToArray())
var origCurrentLogicLooper = LogicLooper.Current;
try
{
if (!InvokeAction(ctx, action))
LogicLooper.Current = this;
foreach (var action in _actions.ToArray())
{
completed.Add(action);
if (!InvokeAction(ctx, action))
{
completed.Add(action);
}
}

foreach (var completedAction in completed)
{
_actions.Remove(completedAction);
}
}

foreach (var completedAction in completed)
return _actions.Count != 0;
}
finally
{
_actions.Remove(completedAction);
LogicLooper.Current = origCurrentLogicLooper;
}

return _actions.Count != 0;
}
}

Expand Down
20 changes: 20 additions & 0 deletions test/LogicLooper.Test/ManualLogicLooperTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -175,4 +175,24 @@ public void RegisterActionAsync_State()
looper.ApproximatelyRunningActions.Should().Be(0);
t1.IsCompletedSuccessfully.Should().BeTrue();
}

[Fact]
public void LogicLooper_Current()
{
Cysharp.Threading.LogicLooper.Current.Should().BeNull();

var looper = new ManualLogicLooper(60.0);
looper.TargetFrameRate.Should().Be(60.0);

var currentLogicLooperInAction = default(ILogicLooper);
looper.RegisterActionAsync((in LogicLooperActionContext ctx) =>
{
currentLogicLooperInAction = Cysharp.Threading.LogicLooper.Current;
return false;
});
looper.Tick();

currentLogicLooperInAction.Should().Be(looper);
Cysharp.Threading.LogicLooper.Current.Should().BeNull();
}
}

0 comments on commit 11f2aa9

Please sign in to comment.