@@ -7,6 +7,7 @@ namespace Discord.Commands | |||||
internal class CommandMap | internal class CommandMap | ||||
{ | { | ||||
static readonly char[] _whitespaceChars = new char[] { ' ', '\r', '\n' }; | static readonly char[] _whitespaceChars = new char[] { ' ', '\r', '\n' }; | ||||
private readonly object _lockObj = new object(); | |||||
private readonly ConcurrentDictionary<string, CommandMapNode> _nodes; | private readonly ConcurrentDictionary<string, CommandMapNode> _nodes; | ||||
@@ -27,7 +28,7 @@ namespace Discord.Commands | |||||
else | else | ||||
name = text.Substring(0, nextSpace); | name = text.Substring(0, nextSpace); | ||||
lock (this) | |||||
lock (_lockObj) | |||||
{ | { | ||||
var nextNode = _nodes.GetOrAdd(name, x => new CommandMapNode(x)); | var nextNode = _nodes.GetOrAdd(name, x => new CommandMapNode(x)); | ||||
nextNode.AddCommand(nextSpace == -1 ? "" : text, nextSpace + 1, command); | nextNode.AddCommand(nextSpace == -1 ? "" : text, nextSpace + 1, command); | ||||
@@ -46,7 +47,7 @@ namespace Discord.Commands | |||||
else | else | ||||
name = text.Substring(0, nextSpace); | name = text.Substring(0, nextSpace); | ||||
lock (this) | |||||
lock (_lockObj) | |||||
{ | { | ||||
CommandMapNode nextNode; | CommandMapNode nextNode; | ||||
if (_nodes.TryGetValue(name, out nextNode)) | if (_nodes.TryGetValue(name, out nextNode)) | ||||
@@ -69,7 +70,7 @@ namespace Discord.Commands | |||||
else | else | ||||
name = text.Substring(0, nextSpace); | name = text.Substring(0, nextSpace); | ||||
lock (this) | |||||
lock (_lockObj) | |||||
{ | { | ||||
CommandMapNode nextNode; | CommandMapNode nextNode; | ||||
if (_nodes.TryGetValue(name, out nextNode)) | if (_nodes.TryGetValue(name, out nextNode)) | ||||
@@ -8,6 +8,7 @@ namespace Discord.Commands | |||||
{ | { | ||||
private readonly ConcurrentDictionary<string, CommandMapNode> _nodes; | private readonly ConcurrentDictionary<string, CommandMapNode> _nodes; | ||||
private readonly string _name; | private readonly string _name; | ||||
private readonly object _lockObj = new object(); | |||||
private ImmutableArray<Command> _commands; | private ImmutableArray<Command> _commands; | ||||
public bool IsEmpty => _commands.Length == 0 && _nodes.Count == 0; | public bool IsEmpty => _commands.Length == 0 && _nodes.Count == 0; | ||||
@@ -24,7 +25,7 @@ namespace Discord.Commands | |||||
int nextSpace = text.IndexOf(' ', index); | int nextSpace = text.IndexOf(' ', index); | ||||
string name; | string name; | ||||
lock (this) | |||||
lock (_lockObj) | |||||
{ | { | ||||
if (text == "") | if (text == "") | ||||
_commands = _commands.Add(command); | _commands = _commands.Add(command); | ||||
@@ -45,7 +46,7 @@ namespace Discord.Commands | |||||
int nextSpace = text.IndexOf(' ', index); | int nextSpace = text.IndexOf(' ', index); | ||||
string name; | string name; | ||||
lock (this) | |||||
lock (_lockObj) | |||||
{ | { | ||||
if (text == "") | if (text == "") | ||||
_commands = _commands.Remove(command); | _commands = _commands.Remove(command); | ||||
@@ -8,6 +8,7 @@ namespace Discord.WebSocket | |||||
internal class SocketGlobalUser : User, ISocketUser | internal class SocketGlobalUser : User, ISocketUser | ||||
{ | { | ||||
internal override bool IsAttached => true; | internal override bool IsAttached => true; | ||||
private readonly object _lockObj = new object(); | |||||
private ushort _references; | private ushort _references; | ||||
@@ -25,13 +26,13 @@ namespace Discord.WebSocket | |||||
{ | { | ||||
checked | checked | ||||
{ | { | ||||
lock (this) | |||||
lock (_lockObj) | |||||
_references++; | _references++; | ||||
} | } | ||||
} | } | ||||
public void RemoveRef(DiscordSocketClient discord) | public void RemoveRef(DiscordSocketClient discord) | ||||
{ | { | ||||
lock (this) | |||||
lock (_lockObj) | |||||
{ | { | ||||
if (--_references == 0) | if (--_references == 0) | ||||
discord.RemoveUser(Id); | discord.RemoveUser(Id); | ||||
@@ -40,14 +41,14 @@ namespace Discord.WebSocket | |||||
public override void Update(Model model, UpdateSource source) | public override void Update(Model model, UpdateSource source) | ||||
{ | { | ||||
lock (this) | |||||
lock (_lockObj) | |||||
base.Update(model, source); | base.Update(model, source); | ||||
} | } | ||||
public void Update(PresenceModel model, UpdateSource source) | public void Update(PresenceModel model, UpdateSource source) | ||||
{ | { | ||||
//Race conditions are okay here. Multiple shards racing already cant guarantee presence in order. | //Race conditions are okay here. Multiple shards racing already cant guarantee presence in order. | ||||
//lock (this) | |||||
//lock (_lockObj) | |||||
//{ | //{ | ||||
var game = model.Game != null ? new Game(model.Game) : null; | var game = model.Game != null ? new Game(model.Game) : null; | ||||
Presence = new Presence(game, model.Status); | Presence = new Presence(game, model.Status); | ||||