removed SafeMutex, because i found lock expression

This commit is contained in:
Timerix22 2021-10-28 15:02:23 +03:00
parent 9762d7f528
commit 5566170210
6 changed files with 25 additions and 71 deletions

View File

@ -51,7 +51,6 @@
<Compile Include="Network\OldNetwork.cs" /> <Compile Include="Network\OldNetwork.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Hasher.cs" /> <Compile Include="Hasher.cs" />
<Compile Include="SafeMutex.cs" />
<Compile Include="SecureRandom.cs" /> <Compile Include="SecureRandom.cs" />
<Compile Include="FrameworkFix.cs" /> <Compile Include="FrameworkFix.cs" />
<Compile Include="TImer.cs" /> <Compile Include="TImer.cs" />

View File

@ -8,28 +8,29 @@ namespace DTLib
public static class DefaultLogger public static class DefaultLogger
{ {
public static void SetLogfile(string dir, string programName) public static void SetLogfile(string dir, string programName)
=> logfile = $"{dir}\\{programName}_{DateTime.Now}.log".Replace(':', '-').Replace(' ', '_'); => Logfile = $"{dir}\\{programName}_{DateTime.Now}.log".Replace(':', '-').Replace(' ', '_');
static string logfile; static public string Logfile { get; set; }
static readonly SafeMutex LogMutex = new();
public static void Log(params string[] msg) public static void Log(params string[] msg)
{ {
if (msg.Length == 1) msg[0] = "[" + DateTime.Now.ToString() + "]: " + msg[0]; if (msg.Length == 1) msg[0] = "[" + DateTime.Now.ToString() + "]: " + msg[0];
else msg[1] = "[" + DateTime.Now.ToString() + "]: " + msg[1]; else msg[1] = "[" + DateTime.Now.ToString() + "]: " + msg[1];
LogNoTime(msg); LogNoTime(msg);
} }
public static void LogNoTime(params string[] msg) => public static void LogNoTime(params string[] msg)
LogMutex.Execute(() => {
lock (Logfile)
{ {
ColoredConsole.Write(msg); ColoredConsole.Write(msg);
if (msg.Length == 1) File.AppendAllText(logfile, msg[0]); if (msg.Length == 1) File.AppendAllText(Logfile, msg[0]);
else else
{ {
StringBuilder strB = new(); StringBuilder strB = new();
for (ushort i = 0; i < msg.Length; i++) for (ushort i = 0; i < msg.Length; i++)
strB.Append(msg[++i]); strB.Append(msg[++i]);
File.AppendAllText(logfile, strB.ToString()); File.AppendAllText(Logfile, strB.ToString());
}
}
} }
});
} }
} }

View File

@ -68,7 +68,7 @@ namespace DTLib.Dtsod
Add(pair.Key, pair.Value); Add(pair.Key, pair.Value);
} }
public DtsodV22(Dictionary<string, DtsodV22.ValueStruct> dict) public DtsodV22(Dictionary<string, ValueStruct> dict)
{ {
foreach (KeyValuePair<string, ValueStruct> pair in dict) foreach (KeyValuePair<string, ValueStruct> pair in dict)
Add(pair.Key, pair.Value); Add(pair.Key, pair.Value);

View File

@ -3,4 +3,5 @@
namespace DTLib namespace DTLib
{ {
public delegate Task EventHandlerAsync<TEventArgs>(object sender, TEventArgs e); public delegate Task EventHandlerAsync<TEventArgs>(object sender, TEventArgs e);
public delegate Task EventHandlerAsync();
} }

View File

@ -19,17 +19,15 @@ namespace DTLib.Network
public uint BytesUploaded = 0; public uint BytesUploaded = 0;
public uint Filesize = 0; public uint Filesize = 0;
public SafeMutex Mutex = new();
// скачивает файл с помощью FSP протокола // скачивает файл с помощью FSP протокола
public void DownloadFile(string filePath_server, string filePath_client) public void DownloadFile(string filePath_server, string filePath_client)
{ {
Mutex.Execute(() => lock (MainSocket)
{ {
Debug("b", $"requesting file download: {filePath_server}\n"); Debug("b", $"requesting file download: {filePath_server}\n");
MainSocket.SendPackage("requesting file download".ToBytes()); MainSocket.SendPackage("requesting file download".ToBytes());
MainSocket.SendPackage(filePath_server.ToBytes()); MainSocket.SendPackage(filePath_server.ToBytes());
}); }
DownloadFile(filePath_client); DownloadFile(filePath_client);
} }
@ -38,17 +36,17 @@ namespace DTLib.Network
using System.IO.Stream fileStream = File.OpenWrite(filePath_client); using System.IO.Stream fileStream = File.OpenWrite(filePath_client);
Download_SharedCode(fileStream, true); Download_SharedCode(fileStream, true);
fileStream.Close(); fileStream.Close();
Debug(new string[] { "g", $" downloaded {BytesDownloaded} of {Filesize} bytes\n" }); Debug("g", $" downloaded {BytesDownloaded} of {Filesize} bytes\n");
} }
public byte[] DownloadFileToMemory(string filePath_server) public byte[] DownloadFileToMemory(string filePath_server)
{ {
Mutex.Execute(() => lock (MainSocket)
{ {
Debug("b", $"requesting file download: {filePath_server}\n"); Debug("b", $"requesting file download: {filePath_server}\n");
MainSocket.SendPackage("requesting file download".ToBytes()); MainSocket.SendPackage("requesting file download".ToBytes());
MainSocket.SendPackage(filePath_server.ToBytes()); MainSocket.SendPackage(filePath_server.ToBytes());
}); }
return DownloadFileToMemory(); return DownloadFileToMemory();
} }
@ -58,13 +56,13 @@ namespace DTLib.Network
Download_SharedCode(fileStream, false); Download_SharedCode(fileStream, false);
byte[] output = fileStream.GetBuffer(); byte[] output = fileStream.GetBuffer();
fileStream.Close(); fileStream.Close();
Debug(new string[] { "g", $" downloaded {BytesDownloaded} of {Filesize} bytes\n" }); Debug("g", $" downloaded {BytesDownloaded} of {Filesize} bytes\n");
return output; return output;
} }
void Download_SharedCode(System.IO.Stream fileStream, bool requiresFlushing) void Download_SharedCode(System.IO.Stream fileStream, bool requiresFlushing)
{ {
Mutex.Execute(() => lock (MainSocket)
{ {
BytesDownloaded = 0; BytesDownloaded = 0;
Filesize = MainSocket.GetPackage().BytesToString().ToUInt(); Filesize = MainSocket.GetPackage().BytesToString().ToUInt();
@ -97,7 +95,7 @@ namespace DTLib.Network
BytesDownloaded += (uint)buffer.Length; BytesDownloaded += (uint)buffer.Length;
fileStream.Write(buffer, 0, buffer.Length); fileStream.Write(buffer, 0, buffer.Length);
} }
}); }
if (requiresFlushing) if (requiresFlushing)
fileStream.Flush(); fileStream.Flush();
} }
@ -109,7 +107,7 @@ namespace DTLib.Network
Debug("b", $"uploading file {filePath}\n"); Debug("b", $"uploading file {filePath}\n");
using System.IO.FileStream fileStream = File.OpenRead(filePath); using System.IO.FileStream fileStream = File.OpenRead(filePath);
Filesize = File.GetSize(filePath).ToUInt(); Filesize = File.GetSize(filePath).ToUInt();
Mutex.Execute(() => lock (MainSocket)
{ {
MainSocket.SendPackage(Filesize.ToString().ToBytes()); MainSocket.SendPackage(Filesize.ToString().ToBytes());
MainSocket.GetAnswer("ready"); MainSocket.GetAnswer("ready");
@ -132,9 +130,9 @@ namespace DTLib.Network
MainSocket.SendPackage(buffer); MainSocket.SendPackage(buffer);
BytesUploaded += (uint)buffer.Length; BytesUploaded += (uint)buffer.Length;
} }
}); }
fileStream.Close(); fileStream.Close();
Debug(new string[] { "g", $" uploaded {BytesUploaded} of {Filesize} bytes\n" }); Debug("g", $" uploaded {BytesUploaded} of {Filesize} bytes\n");
} }
public void DownloadByManifest(string dirOnServer, string dirOnClient, bool overwrite = false, bool delete_excess = false) public void DownloadByManifest(string dirOnServer, string dirOnClient, bool overwrite = false, bool delete_excess = false)
@ -144,7 +142,7 @@ namespace DTLib.Network
if (!dirOnServer.EndsWith("\\")) if (!dirOnServer.EndsWith("\\"))
dirOnServer += "\\"; dirOnServer += "\\";
Debug("b", "downloading manifest <", "c", dirOnServer + "manifest.dtsod", "b", ">\n"); Debug("b", "downloading manifest <", "c", dirOnServer + "manifest.dtsod", "b", ">\n");
DtsodV22 manifest = new Dtsod.DtsodV22(DownloadFileToMemory(dirOnServer + "manifest.dtsod").BytesToString()); DtsodV22 manifest = new DtsodV22(DownloadFileToMemory(dirOnServer + "manifest.dtsod").BytesToString());
Debug("g", $"found {manifest.Values.Count} files in manifest\n"); Debug("g", $"found {manifest.Values.Count} files in manifest\n");
Hasher hasher = new Hasher(); Hasher hasher = new Hasher();
foreach (string fileOnServer in manifest.Keys) foreach (string fileOnServer in manifest.Keys)
@ -202,13 +200,11 @@ namespace DTLib.Network
static void Debug(params string[] msg) static void Debug(params string[] msg)
{ {
if (debug) if (debug) Log(msg);
Log(msg);
} }
static void DebugNoTime(params string[] msg) static void DebugNoTime(params string[] msg)
{ {
if (debug) if (debug) LogNoTime(msg);
LogNoTime(msg);
} }
} }
} }

View File

@ -1,43 +0,0 @@
using System;
using System.Threading;
namespace DTLib
{
public class SafeMutex
{
readonly Mutex Mutex = new();
bool isReleased = false;
// тут выполняется отправленный код
public void Execute(Action action, out Exception exception)
{
try
{
exception = null;
Execute(action);
}
catch (Exception ex)
{
exception = ex;
if (!isReleased)
Mutex.ReleaseMutex();
}
}
public void Execute(Action action)
{
Mutex.WaitOne();
action();
Mutex.ReleaseMutex();
isReleased = true;
}
public T Execute<T>(Func<T> action)
{
Mutex.WaitOne();
T rezult = action();
Mutex.ReleaseMutex();
isReleased = true;
return rezult;
}
}
}