You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Zero/ZeroLevel/Services/Network/Utils/RequestBuffer.cs

129 lines
3.5 KiB

6 years ago
using System;
using System.Collections.Generic;
5 years ago
using System.Threading;
6 years ago
using ZeroLevel.Services.Pools;
namespace ZeroLevel.Network
{
internal sealed class RequestBuffer
{
5 years ago
private SpinLock _reqeust_lock = new SpinLock();
6 years ago
private Dictionary<long, RequestInfo> _requests = new Dictionary<long, RequestInfo>();
private static ObjectPool<RequestInfo> _ri_pool = new ObjectPool<RequestInfo>(() => new RequestInfo());
public void RegisterForFrame(int identity, Action<byte[]> callback, Action<string> fail = null)
6 years ago
{
var ri = _ri_pool.Allocate();
5 years ago
bool take = false;
try
6 years ago
{
5 years ago
_reqeust_lock.Enter(ref take);
6 years ago
ri.Reset(callback, fail);
5 years ago
_requests.Add(identity, ri);
6 years ago
}
5 years ago
finally
{
if (take) _reqeust_lock.Exit(false);
}
6 years ago
}
public void Fail(long frameId, string message)
{
RequestInfo ri = null;
5 years ago
bool take = false;
try
6 years ago
{
5 years ago
_reqeust_lock.Enter(ref take);
6 years ago
if (_requests.ContainsKey(frameId))
{
ri = _requests[frameId];
_requests.Remove(frameId);
}
}
5 years ago
finally
{
if (take) _reqeust_lock.Exit(false);
}
6 years ago
if (ri != null)
{
ri.Fail(message);
_ri_pool.Free(ri);
}
}
public void Success(long frameId, byte[] data)
6 years ago
{
RequestInfo ri = null;
5 years ago
bool take = false;
try
6 years ago
{
5 years ago
_reqeust_lock.Enter(ref take);
6 years ago
if (_requests.ContainsKey(frameId))
{
ri = _requests[frameId];
_requests.Remove(frameId);
}
}
5 years ago
finally
{
if (take) _reqeust_lock.Exit(false);
}
6 years ago
if (ri != null)
{
ri.Success(data);
6 years ago
_ri_pool.Free(ri);
}
}
public void StartSend(long frameId)
{
RequestInfo ri = null;
5 years ago
bool take = false;
try
6 years ago
{
5 years ago
_reqeust_lock.Enter(ref take);
6 years ago
if (_requests.ContainsKey(frameId))
{
ri = _requests[frameId];
}
}
5 years ago
finally
{
if (take) _reqeust_lock.Exit(false);
}
6 years ago
if (ri != null)
{
ri.StartSend();
}
}
public void TestForTimeouts()
{
var now_ticks = DateTime.UtcNow.Ticks;
var to_remove = new List<long>();
5 years ago
bool take = false;
try
6 years ago
{
5 years ago
_reqeust_lock.Enter(ref take);
6 years ago
foreach (var pair in _requests)
{
if (pair.Value.Sended == false) continue;
var diff = now_ticks - pair.Value.Timestamp;
5 years ago
if (diff > BaseSocket.MAX_REQUEST_TIME_TICKS)
6 years ago
{
to_remove.Add(pair.Key);
}
}
}
5 years ago
finally
{
if (take) _reqeust_lock.Exit(false);
}
6 years ago
foreach (var key in to_remove)
{
Fail(key, "Timeout");
}
}
}
}

Powered by TurnKey Linux.