From 3ca25d345b9ba9e2de74999796e1846739ab89c7 Mon Sep 17 00:00:00 2001 From: Ogoun Date: Fri, 7 Feb 2020 18:11:55 +0300 Subject: [PATCH] Experemental --- .../Logging/Implementation/ConsoleLogger.cs | 1 - .../Serialization/PrimitiveTypeSerializer.cs | 1 + .../Services/Shedulling/ExpiredObject.cs | 3 + ZeroLevel/Services/Shedulling/ISheduller.cs | 2 + .../Services/Shedulling/ShedullerImpl.cs | 5 +- .../Services/Shedulling/TaskDispatcher.cs | 69 +++++++++++++++++++ 6 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 ZeroLevel/Services/Shedulling/TaskDispatcher.cs diff --git a/ZeroLevel/Services/Logging/Implementation/ConsoleLogger.cs b/ZeroLevel/Services/Logging/Implementation/ConsoleLogger.cs index 4326aba..892e065 100644 --- a/ZeroLevel/Services/Logging/Implementation/ConsoleLogger.cs +++ b/ZeroLevel/Services/Logging/Implementation/ConsoleLogger.cs @@ -1,5 +1,4 @@ using System; -using ZeroLevel.Services.Logging; namespace ZeroLevel.Logging { diff --git a/ZeroLevel/Services/Serialization/PrimitiveTypeSerializer.cs b/ZeroLevel/Services/Serialization/PrimitiveTypeSerializer.cs index f655971..e7bb090 100644 --- a/ZeroLevel/Services/Serialization/PrimitiveTypeSerializer.cs +++ b/ZeroLevel/Services/Serialization/PrimitiveTypeSerializer.cs @@ -517,6 +517,7 @@ namespace ZeroLevel.Services.Serialization wrapper.ReadId = wrapper.Invoker.ConfigureGeneric(typeof(MemoryStreamReader), elementType, readName).First(); wrapper.WriteId = wrapper.Invoker.ConfigureGeneric(typeof(MemoryStreamWriter), elementType, mi => mi.Name.Equals(writeName) && mi.IsGenericMethod).First(); + _concrete_type_cachee[type] = wrapper; } } diff --git a/ZeroLevel/Services/Shedulling/ExpiredObject.cs b/ZeroLevel/Services/Shedulling/ExpiredObject.cs index 13aceb7..76214e5 100644 --- a/ZeroLevel/Services/Shedulling/ExpiredObject.cs +++ b/ZeroLevel/Services/Shedulling/ExpiredObject.cs @@ -10,6 +10,9 @@ namespace ZeroLevel.Services.Shedulling { private static long _counter = 0; + internal static void ResetIndex(long index) + => _counter = index; + public ExpiredObject() { Key = Interlocked.Increment(ref _counter); diff --git a/ZeroLevel/Services/Shedulling/ISheduller.cs b/ZeroLevel/Services/Shedulling/ISheduller.cs index 0ffb400..5ae13c1 100644 --- a/ZeroLevel/Services/Shedulling/ISheduller.cs +++ b/ZeroLevel/Services/Shedulling/ISheduller.cs @@ -92,6 +92,8 @@ namespace ZeroLevel.Services.Shedulling bool Remove(long key); + void SetInitialIndex(long index); + #endregion Sheduller control } } \ No newline at end of file diff --git a/ZeroLevel/Services/Shedulling/ShedullerImpl.cs b/ZeroLevel/Services/Shedulling/ShedullerImpl.cs index 26b0008..c902e9a 100644 --- a/ZeroLevel/Services/Shedulling/ShedullerImpl.cs +++ b/ZeroLevel/Services/Shedulling/ShedullerImpl.cs @@ -288,6 +288,10 @@ namespace ZeroLevel.Services.Shedulling return success; } + public void SetInitialIndex(long index) + { + ExpiredObject.ResetIndex(index); + } #endregion Sheduller control #region IDisposable @@ -305,7 +309,6 @@ namespace ZeroLevel.Services.Shedulling _sheduller.Dispose(); } } - #endregion IDisposable } } \ No newline at end of file diff --git a/ZeroLevel/Services/Shedulling/TaskDispatcher.cs b/ZeroLevel/Services/Shedulling/TaskDispatcher.cs new file mode 100644 index 0000000..3951261 --- /dev/null +++ b/ZeroLevel/Services/Shedulling/TaskDispatcher.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using ZeroLevel.Services.Serialization; + +namespace ZeroLevel.Services.Shedulling +{ + public interface ITaskDb + { + long GetLastCounter(); + void Store(TaskRecord task); + } + + public class TaskRecord + { + public long Identity; + public string TypeName; + public string MethodName; + public IBinarySerializable Parameter; + + public TaskGroup Parent; + } + + public class TaskGroup + { + public long Identity; + public IEnumerable Tasks; + + public TaskPipeline Parent; + } + + public class TaskPipeline + { + public long Identity; + IEnumerable Pipeline; + + public TaskQueue Parent; + } + + public class TaskQueue + { + public long Identity; + } + + public class TaskDispatcher + { + ISheduller sheduller; + + public TaskDispatcher(ITaskDb db) + { + sheduller.SetInitialIndex(db.GetLastCounter()); + } + + private MethodInfo FindMethod(TaskRecord task) + { + var type = Type.GetType(task.TypeName); + var method = type.GetMethods().First(m => m.Name.Equals(task.MethodName, StringComparison.Ordinal)); + + + return method; + } + + public static void Add(Expression> methodCall) + { + } + } +}