From 4f77d66a069520dd86504adf70f920f5999a83fc Mon Sep 17 00:00:00 2001 From: Ogoun Date: Sun, 3 May 2020 18:52:02 +0300 Subject: [PATCH] refactoring --- TestApp/Program.cs | 6 - .../Services/Extensions/LinqExtension.cs | 28 +++++ .../Network/Extensions/ExchangeExtension.cs | 2 - ZeroLevel/Services/Network/SocketClient.cs | 1 + .../Network/Utils/NetworkPacketFactory.cs | 1 - .../Services/Network/Utils/RequestBuffer.cs | 107 +++--------------- ZeroLevel/Services/Trees/DSA.cs | 65 ++++++++++- 7 files changed, 111 insertions(+), 99 deletions(-) diff --git a/TestApp/Program.cs b/TestApp/Program.cs index 11b5bd4..04923dd 100644 --- a/TestApp/Program.cs +++ b/TestApp/Program.cs @@ -1,12 +1,6 @@ using Newtonsoft.Json; -using System; -using System.IO; -using System.Text; using ZeroLevel; -using ZeroLevel.Implementation.Semantic.Helpers; using ZeroLevel.Logging; -using ZeroLevel.Services.Serialization; -using ZeroLevel.Services.Trees; namespace TestApp { diff --git a/ZeroLevel/Services/Extensions/LinqExtension.cs b/ZeroLevel/Services/Extensions/LinqExtension.cs index ebe42f5..863cf76 100644 --- a/ZeroLevel/Services/Extensions/LinqExtension.cs +++ b/ZeroLevel/Services/Extensions/LinqExtension.cs @@ -4,6 +4,34 @@ namespace System.Linq { public static class LinqExtension { + public static IEnumerable ZipLongest(this IEnumerable left, IEnumerable right) + { + IEnumerator leftEnumerator = left.GetEnumerator(); + IEnumerator rightEnumerator = right.GetEnumerator(); + + bool hasLeft = leftEnumerator.MoveNext(); + bool hasRight = rightEnumerator.MoveNext(); + + while (hasLeft || hasRight) + { + if (hasLeft && hasRight) + { + yield return new T[] { leftEnumerator.Current, rightEnumerator.Current }; + } + else if (hasLeft) + { + yield return new T[] { leftEnumerator.Current, default(T) }; + } + else if (hasRight) + { + yield return new T[] { default(T), rightEnumerator.Current }; + } + + hasLeft = leftEnumerator.MoveNext(); + hasRight = rightEnumerator.MoveNext(); + } + } + public static IEnumerable DistinctBy (this IEnumerable source, Func keySelector) { diff --git a/ZeroLevel/Services/Network/Extensions/ExchangeExtension.cs b/ZeroLevel/Services/Network/Extensions/ExchangeExtension.cs index 8af73b3..d6c06ea 100644 --- a/ZeroLevel/Services/Network/Extensions/ExchangeExtension.cs +++ b/ZeroLevel/Services/Network/Extensions/ExchangeExtension.cs @@ -88,8 +88,6 @@ namespace ZeroLevel.Network return response; } - - public static Tresponse Request(this IClientSet exchange, string alias) { Tresponse response = default; diff --git a/ZeroLevel/Services/Network/SocketClient.cs b/ZeroLevel/Services/Network/SocketClient.cs index 7ee39be..ee73fc5 100644 --- a/ZeroLevel/Services/Network/SocketClient.cs +++ b/ZeroLevel/Services/Network/SocketClient.cs @@ -23,6 +23,7 @@ namespace ZeroLevel.Network public static IncomingFrame NewFrame() => new IncomingFrame(); } + private class SendFrame { private SendFrame() { } diff --git a/ZeroLevel/Services/Network/Utils/NetworkPacketFactory.cs b/ZeroLevel/Services/Network/Utils/NetworkPacketFactory.cs index 600dd37..8fbe705 100644 --- a/ZeroLevel/Services/Network/Utils/NetworkPacketFactory.cs +++ b/ZeroLevel/Services/Network/Utils/NetworkPacketFactory.cs @@ -60,7 +60,6 @@ namespace ZeroLevel.Network packet[7] = id[2]; packet[8] = id[3]; - packet[9] = (byte)(MAGIC ^ packet[1] ^ packet[2] ^ packet[3] ^ packet[4]); HashData(data, packet[9]); diff --git a/ZeroLevel/Services/Network/Utils/RequestBuffer.cs b/ZeroLevel/Services/Network/Utils/RequestBuffer.cs index 29ff36f..13bc930 100644 --- a/ZeroLevel/Services/Network/Utils/RequestBuffer.cs +++ b/ZeroLevel/Services/Network/Utils/RequestBuffer.cs @@ -1,51 +1,27 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; -using System.Threading; using ZeroLevel.Services.Pools; namespace ZeroLevel.Network { internal sealed class RequestBuffer { - private SpinLock _reqeust_lock = new SpinLock(); - private Dictionary _requests = new Dictionary(); + private ConcurrentDictionary _requests = new ConcurrentDictionary(); private static ObjectPool _ri_pool = new ObjectPool(() => new RequestInfo()); public void RegisterForFrame(int identity, Action callback, Action fail = null) { var ri = _ri_pool.Allocate(); - bool take = false; - try - { - _reqeust_lock.Enter(ref take); - ri.Reset(callback, fail); - _requests.Add(identity, ri); - } - finally - { - if (take) _reqeust_lock.Exit(false); - } + ri.Reset(callback, fail); + _requests[identity] = ri; } public void Fail(long frameId, string message) { - RequestInfo ri = null; - bool take = false; - try - { - _reqeust_lock.Enter(ref take); - if (_requests.ContainsKey(frameId)) - { - ri = _requests[frameId]; - _requests.Remove(frameId); - } - } - finally - { - if (take) _reqeust_lock.Exit(false); - } - if (ri != null) + RequestInfo ri; + if (_requests.TryRemove(frameId, out ri)) { ri.Fail(message); _ri_pool.Free(ri); @@ -54,22 +30,8 @@ namespace ZeroLevel.Network public void Success(long frameId, byte[] data) { - RequestInfo ri = null; - bool take = false; - try - { - _reqeust_lock.Enter(ref take); - if (_requests.ContainsKey(frameId)) - { - ri = _requests[frameId]; - _requests.Remove(frameId); - } - } - finally - { - if (take) _reqeust_lock.Exit(false); - } - if (ri != null) + RequestInfo ri; + if (_requests.TryRemove(frameId, out ri)) { ri.Success(data); _ri_pool.Free(ri); @@ -78,21 +40,8 @@ namespace ZeroLevel.Network public void StartSend(long frameId) { - RequestInfo ri = null; - bool take = false; - try - { - _reqeust_lock.Enter(ref take); - if (_requests.ContainsKey(frameId)) - { - ri = _requests[frameId]; - } - } - finally - { - if (take) _reqeust_lock.Exit(false); - } - if (ri != null) + RequestInfo ri; + if (_requests.TryGetValue(frameId, out ri)) { ri.StartSend(); } @@ -100,47 +49,27 @@ namespace ZeroLevel.Network public void Timeout(List frameIds) { - bool take = false; - try + RequestInfo ri; + for (int i = 0; i < frameIds.Count; i++) { - _reqeust_lock.Enter(ref take); - for (int i = 0; i < frameIds.Count; i++) + if (_requests.TryRemove(frameIds[i], out ri)) { - if (_requests.ContainsKey(frameIds[i])) - { - _ri_pool.Free(_requests[frameIds[i]]); - _requests.Remove(frameIds[i]); - } + _ri_pool.Free(ri); } } - finally - { - if (take) _reqeust_lock.Exit(false); - } } public void TestForTimeouts() { var now_ticks = DateTime.UtcNow.Ticks; var to_remove = new List(); - KeyValuePair[] to_proceed; - bool take = false; - try - { - _reqeust_lock.Enter(ref take); - to_proceed = _requests.Select(x => x).ToArray(); - } - finally - { - if (take) _reqeust_lock.Exit(false); - } - for (int i = 0; i < to_proceed.Length; i++) + foreach (var pair in _requests) { - if (to_proceed[i].Value.Sended == false) continue; - var diff = now_ticks - to_proceed[i].Value.Timestamp; + if (pair.Value.Sended == false) continue; + var diff = now_ticks - pair.Value.Timestamp; if (diff > BaseSocket.MAX_REQUEST_TIME_TICKS) { - to_remove.Add(to_proceed[i].Key); + to_remove.Add(pair.Key); } } Timeout(to_remove); diff --git a/ZeroLevel/Services/Trees/DSA.cs b/ZeroLevel/Services/Trees/DSA.cs index 473689e..6fcee90 100644 --- a/ZeroLevel/Services/Trees/DSA.cs +++ b/ZeroLevel/Services/Trees/DSA.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Text; using System.Threading; using ZeroLevel.Services.Serialization; @@ -77,6 +78,48 @@ namespace ZeroLevel.Services.Trees this._is_teminate = reader.ReadBoolean(); this._transtions = reader.ReadDictionary(); } + + public void Reverse(State head) + { + var path = new Stack>(); + foreach (var s in _transtions) + { + s.Value.Forward(head, s.Key, path); + } + } + + private void Forward(State head, char ch, Stack> path) + { + path.Push(Tuple.Create(ch, _is_teminate)); + if (_is_teminate) + { + Backward(head, path); + } + foreach (var s in _transtions) + { + s.Value.Forward(head, s.Key, path); + } + path.Pop(); + } + + private void Backward(State head, Stack> path) + { + State current = head; + foreach (var pair in path) + { + if (false == current._transtions.ContainsKey(pair.Item1)) + { + var next = new State(); + current._transtions.Add(pair.Item1, next); + current = next; + } + else + { + current = current._transtions[pair.Item1]; + } + } + current._is_teminate = true; + } } public class DSA @@ -124,5 +167,25 @@ namespace ZeroLevel.Services.Trees { return _initialState.Iterator(new StringBuilder()); } + + public void Reverse() + { + var reverse_initial = new State(); + _initialState.Reverse(reverse_initial); + _initialState = reverse_initial; + } + + public void Optimize() + { + // merge + // reverse + // merge + // reverse + + /*var reverse_initial = new State(); + _initialState.Reverse(reverse_initial); + _initialState = new State(); + reverse_initial.Reverse(_initialState);*/ + } } }