75 lines
No EOL
1.9 KiB
C#
75 lines
No EOL
1.9 KiB
C#
using System.Collections;
|
|
using System.Threading;
|
|
|
|
using FrostFS.Refs;
|
|
|
|
namespace FrostFS.SDK.ClientV2.Mappers.GRPC;
|
|
|
|
public static class VersionMapper
|
|
{
|
|
private static readonly Hashtable _cacheMessages = [];
|
|
private static readonly Hashtable _cacheModels = [];
|
|
private static SpinLock _spinlock = new();
|
|
|
|
public static Version ToMessage(this FrostFsVersion model)
|
|
{
|
|
var key = model.Major << 16 + model.Minor;
|
|
|
|
if (!_cacheMessages.ContainsKey(key))
|
|
{
|
|
bool lockTaken = false;
|
|
try
|
|
{
|
|
_spinlock.Enter(ref lockTaken);
|
|
var message = new Version
|
|
{
|
|
Major = (uint)model.Major,
|
|
Minor = (uint)model.Minor
|
|
};
|
|
|
|
_cacheMessages.Add(key, message);
|
|
return message;
|
|
}
|
|
catch (System.ArgumentException)
|
|
{
|
|
// ignore attempt to add duplicate
|
|
}
|
|
finally
|
|
{
|
|
if (lockTaken)
|
|
_spinlock.Exit(false);
|
|
}
|
|
}
|
|
|
|
return (Version)_cacheMessages[key];
|
|
}
|
|
|
|
public static FrostFsVersion ToModel(this Version message)
|
|
{
|
|
var key = (int)message.Major << 16 + (int)message.Minor;
|
|
|
|
if (!_cacheModels.ContainsKey(key))
|
|
{
|
|
bool lockTaken = false;
|
|
try
|
|
{
|
|
_spinlock.Enter(ref lockTaken);
|
|
var model = new FrostFsVersion((int)message.Major, (int)message.Minor);
|
|
|
|
_cacheModels.Add(key, model);
|
|
return model;
|
|
}
|
|
catch (System.ArgumentException)
|
|
{
|
|
// ignore attempt to add duplicate
|
|
}
|
|
finally
|
|
{
|
|
if (lockTaken)
|
|
_spinlock.Exit(false);
|
|
}
|
|
}
|
|
|
|
return (FrostFsVersion)_cacheModels[key];
|
|
}
|
|
} |