Changed various locking mechanism.
This commit is contained in:
@@ -14,7 +14,7 @@ namespace HermesSocketServer.Services
|
||||
private readonly ServerConfiguration _configuration;
|
||||
private readonly Serilog.ILogger _logger;
|
||||
private readonly IDictionary<string, Channel> _channels;
|
||||
private readonly object _lock;
|
||||
private readonly Mutex _mutex;
|
||||
|
||||
public ChannelManager(IStore<string, User> users, Database database, IStore<string, TTSVoice> voices, ServerConfiguration configuration, Serilog.ILogger logger)
|
||||
{
|
||||
@@ -24,7 +24,7 @@ namespace HermesSocketServer.Services
|
||||
_configuration = configuration;
|
||||
_logger = logger;
|
||||
_channels = new ConcurrentDictionary<string, Channel>();
|
||||
_lock = new object();
|
||||
_mutex = new Mutex();
|
||||
}
|
||||
|
||||
|
||||
@@ -36,15 +36,16 @@ namespace HermesSocketServer.Services
|
||||
|
||||
return await Task.Run(() =>
|
||||
{
|
||||
lock (_lock)
|
||||
try
|
||||
{
|
||||
_mutex.WaitOne();
|
||||
if (_channels.TryGetValue(userId, out var channel))
|
||||
return Task.FromResult<Channel?>(channel);
|
||||
return channel;
|
||||
|
||||
var actionTable = _configuration.Database.Tables["Action"];
|
||||
var chatterTable = _configuration.Database.Tables["Chatter"];
|
||||
var connectionTable = _configuration.Database.Tables["Connection"];
|
||||
//var chatterGroupTable = _configuration.Database.Tables["ChatterGroup"];
|
||||
var connectionStateTable = _configuration.Database.Tables["ConnectionState"];
|
||||
var groupTable = _configuration.Database.Tables["Group"];
|
||||
var groupPermissionTable = _configuration.Database.Tables["GroupPermission"];
|
||||
var policyTable = _configuration.Database.Tables["Policy"];
|
||||
@@ -93,22 +94,43 @@ namespace HermesSocketServer.Services
|
||||
]);
|
||||
|
||||
_channels.Add(userId, channel);
|
||||
return Task.FromResult<Channel?>(channel);
|
||||
return channel;
|
||||
}
|
||||
finally
|
||||
{
|
||||
_mutex.ReleaseMutex();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public Channel? Get(string channelId)
|
||||
{
|
||||
if (_channels.TryGetValue(channelId, out var channel))
|
||||
return channel;
|
||||
return null;
|
||||
try
|
||||
{
|
||||
_mutex.WaitOne();
|
||||
if (_channels.TryGetValue(channelId, out var channel))
|
||||
return channel;
|
||||
return null;
|
||||
}
|
||||
finally
|
||||
{
|
||||
_mutex.ReleaseMutex();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task Save(string userId)
|
||||
{
|
||||
if (!_channels.TryGetValue(userId, out var channel))
|
||||
return;
|
||||
Channel? channel;
|
||||
try
|
||||
{
|
||||
_mutex.WaitOne();
|
||||
if (!_channels.TryGetValue(userId, out channel))
|
||||
return;
|
||||
}
|
||||
finally
|
||||
{
|
||||
_mutex.ReleaseMutex();
|
||||
}
|
||||
|
||||
_logger.Debug($"Saving channel data to database [channel id: {channel.Id}][channel name: {channel.User.Name}]");
|
||||
await Task.WhenAll([
|
||||
|
||||
Reference in New Issue
Block a user