-
Notifications
You must be signed in to change notification settings - Fork 0
/
SharedRingBuffer.cs
109 lines (97 loc) · 2.85 KB
/
SharedRingBuffer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Text;
namespace Loader
{
public class SharedRingBuffer : IDisposable
{
private readonly MemoryMappedFile _memory;
private readonly MemoryMappedViewStream _memoryStream;
private readonly BinaryWriter _writer;
private readonly BinaryReader _reader;
private int _parser;
private readonly int _size;
public int Parser
{
get
{
return _parser;
}
set
{
_parser = value;
}
}
public SharedRingBuffer(string name, int size)
{
_size = size;
_memory = MemoryMappedFile.CreateOrOpen(name, size + 1);
_memoryStream = _memory.CreateViewStream();
_writer = new BinaryWriter(_memoryStream);
_reader = new BinaryReader(_memoryStream);
_writer.Write(char.MinValue);
}
public void Write(uint value)
{
_writer.Seek(_parser, SeekOrigin.Begin);
_writer.Write(value);
_parser = (_parser + 4) % _size;
}
public void Write(byte[] arr)
{
foreach (byte c in arr)
Write(c);
}
public void Write(char c)
{
_writer.Seek(_parser, SeekOrigin.Begin);
_writer.Write(c);
_parser = (_parser + 1) % _size;
}
public void Write(byte c)
{
_writer.Seek(_parser, SeekOrigin.Begin);
_writer.Write(c);
_parser = (_parser + 1) % _size;
}
public void Write(string text)
{
foreach (uint num in Encoding.ASCII.GetBytes(text))
Write((char)(num ^ 39U));
Write(char.MinValue);
long position = _writer.BaseStream.Position;
Write(char.MinValue);
_parser = (int)position;
}
public bool HasMsg()
{
_memoryStream.Seek(_parser, SeekOrigin.Begin);
return _reader.ReadChar() != 0;
}
public string GetMsg()
{
_memoryStream.Seek(_parser, SeekOrigin.Begin);
StringBuilder stringBuilder = new StringBuilder();
char ch;
while ((ch = _reader.ReadChar()) != 0)
{
stringBuilder.Append(ch);
_parser = (_parser + 1) % _size;
}
_parser = (_parser + 1) % _size;
return stringBuilder.ToString();
}
public void Reset()
{
_parser = 0;
_writer.Seek(0, SeekOrigin.Begin);
_writer.Write(char.MinValue);
}
public void Dispose()
{
_memoryStream.Close();
_memory.Dispose();
}
}
}