Skip to content

Commit 0772ce2

Browse files
authored
log all access to CompositeLogger (#2278)
BenchmarkRunner uses a single instance of CompositeLogger, it passes it as ILogger to various components, which may use it in parallel. We need to acquire the lock to avoid race conditions like #2125 and #2264
1 parent b264718 commit 0772ce2

File tree

2 files changed

+33
-16
lines changed

2 files changed

+33
-16
lines changed

src/BenchmarkDotNet/Loggers/AsyncProcessOutputReader.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,7 @@ private void ProcessOnOutputDataReceived(object sender, DataReceivedEventArgs e)
123123

124124
if (logOutput)
125125
{
126-
lock (this) // #2125
127-
{
128-
logger.WriteLine(e.Data);
129-
}
126+
logger.WriteLine(e.Data);
130127
}
131128
}
132129
}
@@ -144,10 +141,7 @@ private void ProcessOnErrorDataReceived(object sender, DataReceivedEventArgs e)
144141

145142
if (logOutput)
146143
{
147-
lock (this) // #2125
148-
{
149-
logger.WriteLineError(e.Data);
150-
}
144+
logger.WriteLineError(e.Data);
151145
}
152146
}
153147
}

src/BenchmarkDotNet/Loggers/CompositeLogger.cs

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,49 @@ internal class CompositeLogger : ILogger
1313

1414
public void Write(LogKind logKind, string text)
1515
{
16-
foreach (var logger in loggers)
17-
logger.Write(logKind, text);
16+
// BenchmarkRunner uses a single instance of CompositeLogger,
17+
// it passes it as ILogger to various components, which may use it in parallel.
18+
// We need to acquire the lock to avoid race conditions like #2125 and #2264
19+
lock (this)
20+
{
21+
foreach (var logger in loggers)
22+
{
23+
logger.Write(logKind, text);
24+
}
25+
}
1826
}
1927

2028
public void WriteLine()
2129
{
22-
foreach (var logger in loggers)
23-
logger.WriteLine();
30+
lock (this)
31+
{
32+
foreach (var logger in loggers)
33+
{
34+
logger.WriteLine();
35+
}
36+
}
2437
}
2538

2639
public void WriteLine(LogKind logKind, string text)
2740
{
28-
foreach (var logger in loggers)
29-
logger.WriteLine(logKind, text);
41+
lock (this)
42+
{
43+
foreach (var logger in loggers)
44+
{
45+
logger.WriteLine(logKind, text);
46+
}
47+
}
3048
}
3149

3250
public void Flush()
3351
{
34-
foreach (var logger in loggers)
35-
logger.Flush();
52+
lock (this)
53+
{
54+
foreach (var logger in loggers)
55+
{
56+
logger.Flush();
57+
}
58+
}
3659
}
3760
}
3861
}

0 commit comments

Comments
 (0)