Compare commits

...

3 Commits

Author SHA1 Message Date
neuecc
5d0d29dffd preview3 2020-05-07 11:28:14 +09:00
neuecc
be539fdb10 fix WhenAll,WhenAny 0-length 2020-05-07 11:27:27 +09:00
neuecc
66fa203f7c improv package exporter 2020-05-07 07:38:41 +09:00
7 changed files with 76 additions and 10 deletions

View File

@@ -16,8 +16,16 @@ namespace NetCoreSandbox
static async UniTask<int> outer()
{
var v = await DoAsync();
return v;
//await Task.WhenAll();
//var foo = await Task.WhenAny(Array.Empty<Task<int>>());
await UniTask.WhenAny(new UniTask[0]);
return 10;
//var v = await DoAsync();
//return v;
}

View File

@@ -11,9 +11,18 @@ public static class PackageExporter
[MenuItem("Tools/Export Unitypackage")]
public static void Export()
{
// configure
var root = "Plugins/UniTask";
var exportPath = "./UniTask.unitypackage";
var version = Environment.GetEnvironmentVariable("UNITY_PACKAGE_VERSION");
var versionJson = Path.Combine(Application.dataPath, root, "package.json");
if (File.Exists(versionJson))
{
var v = JsonUtility.FromJson<Version>(File.ReadAllText(versionJson));
version = v.version;
}
var fileName = string.IsNullOrEmpty(version) ? "UniTask.unitypackage" : $"UniTask.{version}.unitypackage";
var exportPath = "./" + fileName;
var path = Path.Combine(Application.dataPath, root);
var assets = Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories)
@@ -30,6 +39,11 @@ public static class PackageExporter
UnityEngine.Debug.Log("Export complete: " + Path.GetFullPath(exportPath));
}
public class Version
{
public string version;
}
}
#endif

View File

@@ -32,11 +32,21 @@ namespace Cysharp.Threading.Tasks.Internal
}
}
public static RentArray<T> CopyToRentArray<T>(IEnumerable<T> source)
public static RentArray<T> Materialize<T>(IEnumerable<T> source)
{
if (source is T[] array)
{
return new RentArray<T>(array, array.Length, null);
}
var defaultCount = 32;
if (source is ICollection<T> coll)
{
if (coll.Count == 0)
{
return new RentArray<T>(Array.Empty<T>(), 0, null);
}
defaultCount = coll.Count;
var pool = ArrayPool<T>.Shared;
var buffer = pool.Rent(defaultCount);

View File

@@ -11,12 +11,17 @@ namespace Cysharp.Threading.Tasks
{
public static UniTask<T[]> WhenAll<T>(params UniTask<T>[] tasks)
{
if (tasks.Length == 0)
{
return UniTask.FromResult(Array.Empty<T>());
}
return new UniTask<T[]>(new WhenAllPromise<T>(tasks, tasks.Length), 0);
}
public static UniTask<T[]> WhenAll<T>(IEnumerable<UniTask<T>> tasks)
{
using (var span = ArrayPoolUtil.CopyToRentArray(tasks))
using (var span = ArrayPoolUtil.Materialize(tasks))
{
var promise = new WhenAllPromise<T>(span.Array, span.Length); // consumed array in constructor.
return new UniTask<T[]>(promise, 0);
@@ -25,12 +30,17 @@ namespace Cysharp.Threading.Tasks
public static UniTask WhenAll(params UniTask[] tasks)
{
if (tasks.Length == 0)
{
return UniTask.CompletedTask;
}
return new UniTask(new WhenAllPromise(tasks, tasks.Length), 0);
}
public static UniTask WhenAll(IEnumerable<UniTask> tasks)
{
using (var span = ArrayPoolUtil.CopyToRentArray(tasks))
using (var span = ArrayPoolUtil.Materialize(tasks))
{
var promise = new WhenAllPromise(span.Array, span.Length); // consumed array in constructor.
return new UniTask(promise, 0);
@@ -48,6 +58,14 @@ namespace Cysharp.Threading.Tasks
TaskTracker.TrackActiveTask(this, 3);
this.completeCount = 0;
if (tasksLength == 0)
{
this.result = Array.Empty<T>();
core.TrySetResult(result);
return;
}
this.result = new T[tasksLength];
for (int i = 0; i < tasksLength; i++)
@@ -144,6 +162,12 @@ namespace Cysharp.Threading.Tasks
this.tasksLength = tasksLength;
this.completeCount = 0;
if (tasksLength == 0)
{
core.TrySetResult(AsyncUnit.Default);
return;
}
for (int i = 0; i < tasksLength; i++)
{
UniTask.Awaiter awaiter;

View File

@@ -21,7 +21,7 @@ namespace Cysharp.Threading.Tasks
public static UniTask<(int winArgumentIndex, T result)> WhenAny<T>(IEnumerable<UniTask<T>> tasks)
{
using (var span = ArrayPoolUtil.CopyToRentArray(tasks))
using (var span = ArrayPoolUtil.Materialize(tasks))
{
return new UniTask<(int, T)>(new WhenAnyPromise<T>(span.Array, span.Length), 0);
}
@@ -36,7 +36,7 @@ namespace Cysharp.Threading.Tasks
/// <summary>Return value is winArgumentIndex</summary>
public static UniTask<int> WhenAny(IEnumerable<UniTask> tasks)
{
using (var span = ArrayPoolUtil.CopyToRentArray(tasks))
using (var span = ArrayPoolUtil.Materialize(tasks))
{
return new UniTask<int>(new WhenAnyPromise(span.Array, span.Length), 0);
}
@@ -186,6 +186,11 @@ namespace Cysharp.Threading.Tasks
public WhenAnyPromise(UniTask<T>[] tasks, int tasksLength)
{
if (tasksLength == 0)
{
throw new ArgumentException("The tasks argument contains no tasks.");
}
TaskTracker.TrackActiveTask(this, 3);
for (int i = 0; i < tasksLength; i++)
@@ -277,6 +282,11 @@ namespace Cysharp.Threading.Tasks
public WhenAnyPromise(UniTask[] tasks, int tasksLength)
{
if (tasksLength == 0)
{
throw new ArgumentException("The tasks argument contains no tasks.");
}
TaskTracker.TrackActiveTask(this, 3);
for (int i = 0; i < tasksLength; i++)

View File

@@ -1,7 +1,7 @@
{
"name": "com.cysharp.unitask",
"displayName": "UniTask",
"version": "2.0.1-preview2",
"version": "2.0.2-preview3",
"unity": "2018.3",
"description": "Provides an efficient async/await integration to Unity.",
"keywords": ["async/await", "async", "Task", "UniTask"],

Binary file not shown.