diff options
| author | Jake Mannens <jake@asger.xyz> | 2026-05-29 01:00:28 +1000 |
|---|---|---|
| committer | Jake Mannens <jake@asger.xyz> | 2026-06-11 01:13:31 +1000 |
| commit | 9ae13fa513cd4888cc5f8bd2307f547418f1714d (patch) | |
| tree | c268da65e4ef87b4c0dfd803908626135f91ccd1 | |
| parent | 344276ea2572241c6b725799d58aff6f3422cd22 (diff) | |
Modified Util.cs to suit WASM client
| -rw-r--r-- | Util.cs | 113 |
1 files changed, 3 insertions, 110 deletions
@@ -1,20 +1,12 @@ -namespace HyperBooru.Util; +using HyperBooru.ApiModels; + +namespace HyperBooru.Client.Util; public static class Extensions { public static readonly string[] MagnitudeOrders = new[] { "K", "M", "G", "T", "P", "E", "Z", "Y", "R", "Q" }; - public static string? NullIfEmpty(this string s) { - s = s.Trim(); - return string.IsNullOrEmpty(s) ? null : s; - } - - public static DateTime? TryParseDateTimeUtc(this string s) { - bool success = DateTime.TryParse(s, out var dateTime); - return success ? DateTime.SpecifyKind(dateTime, DateTimeKind.Utc) : null; - } - public static string ToBytesSI(this long x) { var exp = (int) Math.Log10(x); var suffix = MagnitudeOrders.ElementAtOrDefault(exp / 3 - 1); @@ -23,103 +15,4 @@ public static class Extensions { double n = x / Math.Pow(10, exp / 3 * 3); return $"{Math.Round(n, 2 - (exp % 3))} {suffix}B"; } - - public static string ToStringHumanReadable(this TimeSpan t) { - if(t.TotalMilliseconds < 1000) - return string.Format("{0:0}ms", t.TotalMilliseconds); - if(t.TotalSeconds < 60) - return string.Format("{0:0.00}s", t.TotalSeconds); - if(t.TotalMinutes < 60) - return string.Format("{0:0}m{0:0}s", t.TotalMinutes, t.Seconds); - if(t.TotalHours < 24) - return string.Format("{0:0}h{0:0}m", t.TotalHours, t.Minutes); - return string.Format("{0:0.00}d", t.TotalDays); - } -} - -public class LimitedConcurrencyTaskScheduler : TaskScheduler { - public sealed override int MaximumConcurrencyLevel => - maxConcurrency; - - private int maxConcurrency; - - [ThreadStatic] - private static bool threadIsProcessingItems; - - private readonly LinkedList<Task> tasks = new(); - - private int delegatesQueuedOrRunning = 0; - - public LimitedConcurrencyTaskScheduler() { - maxConcurrency = Environment.ProcessorCount; - } - - public LimitedConcurrencyTaskScheduler(int maxConcurrency) { - if(maxConcurrency < 1) - throw new ArgumentOutOfRangeException("maxConcurrency must be greater than 0"); - this.maxConcurrency = (int) maxConcurrency; - } - - protected sealed override void QueueTask(Task task) { - lock(tasks) { - tasks.AddLast(task); - if(delegatesQueuedOrRunning < maxConcurrency) { - delegatesQueuedOrRunning++; - NotifyThreadPoolOfPendingWork(); - } - } - } - - private void NotifyThreadPoolOfPendingWork() { - ThreadPool.UnsafeQueueUserWorkItem(_ => { - threadIsProcessingItems = true; - try { - while(true) { - Task item; - lock(tasks) { - if(tasks.Count == 0) { - delegatesQueuedOrRunning--; - break; - } else { - item = tasks.First.Value; - tasks.RemoveFirst(); - } - } - TryExecuteTask(item); - } - } finally { - threadIsProcessingItems = false; - } - }, null); - } - - protected sealed override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) { - if(!threadIsProcessingItems) - return false; - - if(taskWasPreviouslyQueued) - return TryDequeue(task) ? TryExecuteTask(task) : false; - else - return TryExecuteTask(task); - } - - protected sealed override bool TryDequeue(Task task) { - lock(tasks) { - return tasks.Remove(task); - } - } - - protected sealed override IEnumerable<Task> GetScheduledTasks() { - bool lockTaken = false; - try { - Monitor.TryEnter(tasks, ref lockTaken); - if(lockTaken) - return tasks; - else - throw new NotSupportedException(); - } finally { - if(lockTaken) - Monitor.Exit(tasks); - } - } } |
