test all passed

pull/73/head
neuecc 2020-05-05 18:12:52 +09:00
parent eb379903b8
commit a26a806b0f
2 changed files with 132 additions and 59 deletions

View File

@ -6,10 +6,29 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using UniRx.Async;
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
public struct MyJob : IJob
{
public int loopCount;
public NativeArray<int> inOut;
public int result;
public void Execute()
{
result = 0;
for (int i = 0; i < loopCount; i++)
{
result++;
}
inOut[0] = result;
}
}
public class SandboxMain : MonoBehaviour
{
public Button okButton;
@ -20,11 +39,45 @@ public class SandboxMain : MonoBehaviour
UniTaskCompletionSource ucs;
async UniTask RunStandardDelayAsync()
{
UnityEngine.Debug.Log("DEB");
await UniTask.DelayFrame(30);
UnityEngine.Debug.Log("DEB END");
}
async UniTask RunJobAsync()
{
var job = new MyJob() { loopCount = 999, inOut = new NativeArray<int>(1, Allocator.TempJob) };
JobHandle.ScheduleBatchedJobs();
var scheduled = job.Schedule();
UnityEngine.Debug.Log("OK");
await scheduled; // .ConfigureAwait(PlayerLoopTiming.Update); // .WaitAsync(PlayerLoopTiming.Update);
UnityEngine.Debug.Log("OK2");
job.inOut.Dispose();
}
void Start()
{
Application.SetStackTraceLogType(LogType.Error, StackTraceLogType.Full);
Application.SetStackTraceLogType(LogType.Exception, StackTraceLogType.Full);
var playerLoop = UnityEngine.LowLevel.PlayerLoop.GetCurrentPlayerLoop();
ShowPlayerLoop.DumpPlayerLoop("Current", playerLoop);
RunStandardDelayAsync().Forget();
//for (int i = 0; i < 14; i++)
//{
// TimingDump((PlayerLoopTiming)i).Forget();
@ -36,6 +89,19 @@ public class SandboxMain : MonoBehaviour
// -----
RunJobAsync().Forget();
//var cor = UniTask.ToCoroutine(async () =>
// {
// var job = new MyJob() { loopCount = 999, inOut = new NativeArray<int>(1, Allocator.TempJob) };
// JobHandle.ScheduleBatchedJobs();
// await job.Schedule().WaitAsync(PlayerLoopTiming.Update);
// job.inOut.Dispose();
// });
//StartCoroutine(cor);
Application.logMessageReceived += Application_logMessageReceived;
@ -56,6 +122,22 @@ public class SandboxMain : MonoBehaviour
});
}
async UniTask SimpleAwait()
{
await UniTask.Yield();
await UniTask.Yield();
await UniTask.Yield();
throw new InvalidOperationException("bar!!!");
}
IEnumerator SimpleCoroutine()
{
yield return null;
yield return null;
yield return null;
throw new InvalidOperationException("foo!!!");
}
async UniTask TimingDump(PlayerLoopTiming timing)
{
while (true)

View File

@ -9,42 +9,45 @@ namespace UniRx.Async
{
public static partial class UnityAsyncExtensions
{
public static async UniTask WaitAsync(this JobHandle jobHandle, PlayerLoopTiming waitTiming)
{
await UniTask.Yield(waitTiming);
jobHandle.Complete();
}
public static UniTask.Awaiter GetAwaiter(this JobHandle jobHandle)
{
var handler = JobHandlePromise.Create(jobHandle, CancellationToken.None, out var token);
if (handler.GetStatus(token).IsCompleted() && handler is JobHandlePromise loopItem)
var handler = JobHandlePromise.Create(jobHandle, out var token);
{
PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, loopItem);
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, loopItem);
PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, loopItem);
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, loopItem);
PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, loopItem);
PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, handler);
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, handler);
PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, handler);
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, handler);
PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, handler);
}
return new UniTask(handler, token).GetAwaiter();
}
public static UniTask ToUniTask(this JobHandle jobHandle, CancellationToken cancellation = default(CancellationToken))
public static UniTask ToUniTask(this JobHandle jobHandle)
{
var handler = JobHandlePromise.Create(jobHandle, cancellation, out var token);
if (handler.GetStatus(token).IsCompleted() && handler is JobHandlePromise loopItem)
var handler = JobHandlePromise.Create(jobHandle, out var token);
{
PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, loopItem);
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, loopItem);
PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, loopItem);
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, loopItem);
PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, loopItem);
PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, handler);
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, handler);
PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, handler);
PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, handler);
PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, handler);
}
return new UniTask(handler, token);
}
public static UniTask ConfigureAwait(this JobHandle jobHandle, PlayerLoopTiming waitTiming, CancellationToken cancellation = default(CancellationToken))
public static UniTask ConfigureAwait(this JobHandle jobHandle, PlayerLoopTiming waitTiming)
{
var handler = JobHandlePromise.Create(jobHandle, cancellation, out var token);
if (handler.GetStatus(token).IsCompleted() && handler is JobHandlePromise loopItem)
var handler = JobHandlePromise.Create(jobHandle, out var token);
{
PlayerLoopHelper.AddAction(waitTiming, loopItem);
PlayerLoopHelper.AddAction(waitTiming, handler);
}
return new UniTask(handler, token);
@ -53,22 +56,16 @@ namespace UniRx.Async
sealed class JobHandlePromise : IUniTaskSource, IPlayerLoopItem
{
JobHandle jobHandle;
CancellationToken cancellationToken;
UniTaskCompletionSourceCore<AsyncUnit> core;
public static IUniTaskSource Create(JobHandle jobHandle, CancellationToken cancellationToken, out short token)
// Cancellation is not supported.
public static JobHandlePromise Create(JobHandle jobHandle, out short token)
{
if (cancellationToken.IsCancellationRequested)
{
return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);
}
// not use pool.
var result = new JobHandlePromise();
result.jobHandle = jobHandle;
result.cancellationToken = cancellationToken;
TaskTracker.TrackActiveTask(result, 3);
@ -99,12 +96,6 @@ namespace UniRx.Async
public bool MoveNext()
{
if (cancellationToken.IsCancellationRequested)
{
core.TrySetCanceled(cancellationToken);
return false;
}
if (jobHandle.IsCompleted)
{
jobHandle.Complete();