Skip to content

Commit 6fcd752

Browse files
committed
refactor concurrents library
1 parent f8e3fbb commit 6fcd752

File tree

7 files changed

+46
-58
lines changed

7 files changed

+46
-58
lines changed

Sources/Falko.ZeroLogger.Targets.Concurrent/Collections/SingleConsumerQueue.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ internal sealed class SingleConsumerQueue<T>
99
{
1010
private const int PrimaryIterationDelta = 0;
1111

12-
private readonly IterableItem<T>[] _items;
12+
private readonly ConcurrentItemIterator<T>[] _items;
1313

1414
private readonly int _itemsCapacity;
1515

@@ -96,7 +96,7 @@ public bool Dequeue<TArgument>
9696

9797
var readNumberIteration = _readNumber.Iteration();
9898

99-
ref var readItem = ref GetIterationItem(ref itemsReference, readNumberIteration);
99+
scoped ref var readItem = ref GetIterationItem(ref itemsReference, readNumberIteration);
100100

101101
var readItemIteration = readItem.Iteration();
102102
var readIterationDelta = readNumberIteration - readItemIteration + IConcurrentIterator.ItemIterationIncrement;
@@ -117,13 +117,13 @@ public bool Dequeue<TArgument>
117117
}
118118

119119
[MethodImpl(MethodImplOptions.AggressiveInlining)]
120-
private ref IterableItem<T> GetItemsReference()
120+
private ref ConcurrentItemIterator<T> GetItemsReference()
121121
{
122122
return ref MemoryMarshal.GetArrayDataReference(_items);
123123
}
124124

125125
[MethodImpl(MethodImplOptions.AggressiveInlining)]
126-
private ref IterableItem<T> GetIterationItem(ref IterableItem<T> itemsReference, int iteration)
126+
private ref ConcurrentItemIterator<T> GetIterationItem(ref ConcurrentItemIterator<T> itemsReference, int iteration)
127127
{
128128
return ref Unsafe.Add(ref itemsReference, GetIterationIndex(iteration));
129129
}
@@ -135,15 +135,15 @@ private int GetIterationIndex(int currentIteration)
135135
}
136136

137137
[MethodImpl(MethodImplOptions.NoInlining)]
138-
private static IterableItem<T>[] InitializeItems(int itemsCapacity)
138+
private static ConcurrentItemIterator<T>[] InitializeItems(int itemsCapacity)
139139
{
140-
var items = new IterableItem<T>[itemsCapacity];
140+
var items = new ConcurrentItemIterator<T>[itemsCapacity];
141141

142142
scoped ref var itemsReference = ref MemoryMarshal.GetArrayDataReference(items);
143143

144144
for (var itemIndex = 0; itemIndex < itemsCapacity; itemIndex++)
145145
{
146-
Unsafe.Add(ref itemsReference, itemIndex).Iterator = itemIndex;
146+
Unsafe.Add(ref itemsReference, itemIndex).Exchange(itemIndex);
147147
}
148148

149149
return items;

Sources/Falko.ZeroLogger.Targets.Concurrent/Concurrents/ConcurrentBoolean.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,6 @@ internal struct ConcurrentBoolean
1616
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1717
public bool IsFalse() => Volatile.Read(ref _value) == FalseValue;
1818

19-
[MethodImpl(MethodImplOptions.AggressiveInlining)]
20-
public void SetTrue() => Interlocked.Exchange(ref _value, TrueValue);
21-
22-
[MethodImpl(MethodImplOptions.AggressiveInlining)]
23-
public void SetFalse() => Interlocked.Exchange(ref _value, FalseValue);
24-
2519
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2620
public bool TrySetTrue()
2721
{

Sources/Falko.ZeroLogger.Targets.Concurrent/Concurrents/IterableItem.cs renamed to Sources/Falko.ZeroLogger.Targets.Concurrent/Concurrents/ConcurrentItemIterator.cs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,12 @@
44
namespace System.Logging.Concurrents;
55

66
[StructLayout(LayoutKind.Sequential)]
7-
internal struct IterableItem<T> : IConcurrentIterator
7+
internal struct ConcurrentItemIterator<T> : IConcurrentIterator
88
{
99
// need this declared this field before 'Iterator' for struct layout reasons
1010
public T Item;
1111

12-
public int Iterator;
13-
14-
int IConcurrentIterator.Iterator
15-
{
16-
get => Iterator;
17-
set => Iterator = value;
18-
}
12+
private int _iterator;
1913

2014
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2115
public T Clear()
@@ -29,24 +23,24 @@ public T Clear()
2923

3024
[MethodImpl(MethodImplOptions.AggressiveInlining)]
3125
public int Iteration() => Volatile
32-
.Read(ref Iterator);
26+
.Read(ref _iterator);
3327

3428
[MethodImpl(MethodImplOptions.AggressiveInlining)]
3529
public void Iterate(int currentIterator) => Volatile
36-
.Write(ref Iterator, currentIterator + IConcurrentIterator.ItemIterationIncrement);
30+
.Write(ref _iterator, currentIterator + IConcurrentIterator.ItemIterationIncrement);
3731

3832
public void Iterate(int currentIterator, int iterations) => Volatile
39-
.Write(ref Iterator, currentIterator + iterations);
33+
.Write(ref _iterator, currentIterator + iterations);
4034

4135
[MethodImpl(MethodImplOptions.AggressiveInlining)]
4236
public bool TryIterate(int currentIterator) => Interlocked
43-
.CompareExchange(ref Iterator, currentIterator + IConcurrentIterator.ItemIterationIncrement, currentIterator) == currentIterator;
37+
.CompareExchange(ref _iterator, currentIterator + IConcurrentIterator.ItemIterationIncrement, currentIterator) == currentIterator;
4438

4539
[MethodImpl(MethodImplOptions.AggressiveInlining)]
4640
public void Exchange(int nextIterator) => Volatile
47-
.Write(ref Iterator, nextIterator);
41+
.Write(ref _iterator, nextIterator);
4842

4943
[MethodImpl(MethodImplOptions.AggressiveInlining)]
5044
public bool TryExchange(int currentIterator, int nextIterator) => Interlocked
51-
.CompareExchange(ref Iterator, nextIterator, currentIterator) == currentIterator;
45+
.CompareExchange(ref _iterator, nextIterator, currentIterator) == currentIterator;
5246
}

Sources/Falko.ZeroLogger.Targets.Concurrent/Concurrents/IConcurrentIterator.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ internal interface IConcurrentIterator
44
{
55
const int ItemIterationIncrement = 1;
66

7-
int Iterator { get; set; }
8-
97
int Iteration();
108

119
void Iterate(int currentIterator);

Sources/Falko.ZeroLogger.Targets.Concurrent/Concurrents/IterableNumber.cs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,25 @@ namespace System.Logging.Concurrents;
88
internal struct IterableNumber : IConcurrentIterator
99
{
1010
[FieldOffset(0)]
11-
public int Iterator;
12-
13-
int IConcurrentIterator.Iterator
14-
{
15-
get => Iterator;
16-
set => Iterator = value;
17-
}
11+
private int _iterator;
1812

1913
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2014
public int Iteration() => Volatile
21-
.Read(ref Iterator);
15+
.Read(ref _iterator);
2216

2317
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2418
public void Iterate(int currentIterator) => Volatile
25-
.Write(ref Iterator, currentIterator + 1);
19+
.Write(ref _iterator, currentIterator + 1);
2620

2721
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2822
public bool TryIterate(int currentIterator) => Interlocked
29-
.CompareExchange(ref Iterator, currentIterator + 1, currentIterator) == currentIterator;
23+
.CompareExchange(ref _iterator, currentIterator + 1, currentIterator) == currentIterator;
3024

3125
[MethodImpl(MethodImplOptions.AggressiveInlining)]
3226
public void Exchange(int nextIterator) => Volatile
33-
.Write(ref Iterator, nextIterator);
27+
.Write(ref _iterator, nextIterator);
3428

3529
[MethodImpl(MethodImplOptions.AggressiveInlining)]
3630
public bool TryExchange(int currentIterator, int nextIterator) => Interlocked
37-
.CompareExchange(ref Iterator, nextIterator, currentIterator) == currentIterator;
31+
.CompareExchange(ref _iterator, nextIterator, currentIterator) == currentIterator;
3832
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System.Logging.Contexts;
2+
using System.Logging.Renderers;
3+
using System.Runtime.CompilerServices;
4+
5+
namespace System.Logging.Targets;
6+
7+
public sealed partial class ConcurrentLoggerTarget
8+
{
9+
private readonly struct RenderableLogContext
10+
{
11+
public readonly LogContext Context;
12+
13+
public readonly ILogContextRenderer Renderer;
14+
15+
// ReSharper disable once ConvertToPrimaryConstructor
16+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
17+
public RenderableLogContext(in LogContext context, ILogContextRenderer renderer)
18+
{
19+
Context = context;
20+
Renderer = renderer;
21+
}
22+
}
23+
}

Sources/Falko.ZeroLogger.Targets.Concurrent/Targets/ConcurrentLoggerTarget.cs

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
namespace System.Logging.Targets;
1010

11-
public sealed class ConcurrentLoggerTarget : LoggerTarget, IThreadPoolWorkItem
11+
public sealed partial class ConcurrentLoggerTarget : LoggerTarget, IThreadPoolWorkItem
1212
{
1313
private readonly SingleConsumerQueue<RenderableLogContext> _logsQueue;
1414

@@ -23,7 +23,7 @@ public sealed class ConcurrentLoggerTarget : LoggerTarget, IThreadPoolWorkItem
2323
private ConcurrentBoolean _disposed;
2424

2525
[MethodImpl(MethodImplOptions.NoInlining)]
26-
public ConcurrentLoggerTarget(LoggerTarget loggerTarget, int capacity = 1024, int timeoutMilliseconds = 25)
26+
public ConcurrentLoggerTarget(LoggerTarget loggerTarget, int capacity = 1024, int timeoutMilliseconds = 24)
2727
{
2828
ArgumentNullException.ThrowIfNull(loggerTarget);
2929
CancellationTimeout.ThrowIfInvalid(timeoutMilliseconds);
@@ -137,19 +137,4 @@ private void QueueWorkItem()
137137
{
138138
ThreadPool.UnsafeQueueUserWorkItem(this, preferLocal: false);
139139
}
140-
141-
private readonly struct RenderableLogContext
142-
{
143-
public readonly LogContext Context;
144-
145-
public readonly ILogContextRenderer Renderer;
146-
147-
// ReSharper disable once ConvertToPrimaryConstructor
148-
[MethodImpl(MethodImplOptions.AggressiveInlining)]
149-
public RenderableLogContext(in LogContext context, ILogContextRenderer renderer)
150-
{
151-
Context = context;
152-
Renderer = renderer;
153-
}
154-
}
155140
}

0 commit comments

Comments
 (0)