diff --git a/BeefDep1.zip b/BeefDep1.zip new file mode 100644 index 00000000..35bfd81d Binary files /dev/null and b/BeefDep1.zip differ diff --git a/BeefLibs/corlib/src/Threading/Tasks/Parallel.bf b/BeefLibs/corlib/src/Threading/Tasks/Parallel.bf new file mode 100644 index 00000000..ceb13dde --- /dev/null +++ b/BeefLibs/corlib/src/Threading/Tasks/Parallel.bf @@ -0,0 +1,40 @@ +namespace System.Threading.Tasks; + +class Parallel +{ + public static void ForEach(Span source, delegate void(T item) body, int maxDegreeOfParallelism = -1) { + int count = source.Length; + if (count == 0) + return; + var processorCount = OperatingSystem.[Friend]GetSystemInfo(.. scope .()).dwNumberOfProcessors; + int degree = maxDegreeOfParallelism == -1 ? processorCount : maxDegreeOfParallelism; + if (degree <= 0) + degree = 1; + degree = Math.Min(degree, count); + if (degree == 1) + { + for (var item in source) + body(item); + return; + } + + Task[] tasks = new Task[degree]; + defer delete tasks; + + int workItemIndex = -1; + for (var i < degree) + { + tasks[i] = new Task(new [&]() => { + int index; + while ((index = Interlocked.Increment(ref workItemIndex)) < count) + body(source[index]); + }); + tasks[i].Start(); + } + + for (var i < degree) { + tasks[i].Wait(); + delete tasks[i]; + } + } +} \ No newline at end of file diff --git a/IDE/src/Compiler/BfSystem.bf b/IDE/src/Compiler/BfSystem.bf index 60cbcd38..00c0f8bd 100644 --- a/IDE/src/Compiler/BfSystem.bf +++ b/IDE/src/Compiler/BfSystem.bf @@ -106,7 +106,7 @@ namespace IDE.Compiler public void* mNativeBfSystem; public bool mIsTiming; - public Monitor mMonitor = new Monitor() ~ delete _; + public Monitor mMonitor = new Monitor() ~ delete _; public Dictionary mParserMap = new Dictionary() ~ delete _; public Dictionary mProjectMap = new Dictionary() ~ delete _;