Skip to content

Commit 7368836

Browse files
authored
Support nullability in SetMeasurementEventCallback (fixes #68025) (#68071)
1 parent a5fad2e commit 7368836

File tree

2 files changed

+48
-14
lines changed

2 files changed

+48
-14
lines changed

src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/MeterListener.cs

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -117,33 +117,37 @@ public void EnableMeasurementEvents(Instrument instrument, object? state = null)
117117
/// <param name="measurementCallback">The callback which can be used to get measurement recording of numeric type T.</param>
118118
public void SetMeasurementEventCallback<T>(MeasurementCallback<T>? measurementCallback) where T : struct
119119
{
120-
if (measurementCallback is MeasurementCallback<byte> byteCallback)
120+
if (measurementCallback is null)
121121
{
122-
_byteMeasurementCallback = (measurementCallback is null) ? ((instrument, measurement, tags, state) => { /* no-op */}) : byteCallback;
122+
measurementCallback = (instrument, measurement, tags, state) => { /* no-op */};
123123
}
124-
else if (measurementCallback is MeasurementCallback<int> intCallback)
124+
if (typeof(T) == typeof(byte))
125+
{
126+
_byteMeasurementCallback = (MeasurementCallback<byte>)(object)measurementCallback;
127+
}
128+
else if (typeof(T) == typeof(int))
125129
{
126-
_intMeasurementCallback = (measurementCallback is null) ? ((instrument, measurement, tags, state) => { /* no-op */}) : intCallback;
130+
_intMeasurementCallback = (MeasurementCallback<int>)(object)measurementCallback;
127131
}
128-
else if (measurementCallback is MeasurementCallback<float> floatCallback)
132+
else if (typeof(T) == typeof(float))
129133
{
130-
_floatMeasurementCallback = (measurementCallback is null) ? ((instrument, measurement, tags, state) => { /* no-op */}) : floatCallback;
134+
_floatMeasurementCallback = (MeasurementCallback<float>)(object)measurementCallback;
131135
}
132-
else if (measurementCallback is MeasurementCallback<double> doubleCallback)
136+
else if (typeof(T) == typeof(double))
133137
{
134-
_doubleMeasurementCallback = (measurementCallback is null) ? ((instrument, measurement, tags, state) => { /* no-op */}) : doubleCallback;
138+
_doubleMeasurementCallback = (MeasurementCallback<double>)(object)measurementCallback;
135139
}
136-
else if (measurementCallback is MeasurementCallback<decimal> decimalCallback)
140+
else if (typeof(T) == typeof(decimal))
137141
{
138-
_decimalMeasurementCallback = (measurementCallback is null) ? ((instrument, measurement, tags, state) => { /* no-op */}) : decimalCallback;
142+
_decimalMeasurementCallback = (MeasurementCallback<decimal>)(object)measurementCallback;
139143
}
140-
else if (measurementCallback is MeasurementCallback<short> shortCallback)
144+
else if (typeof(T) == typeof(short))
141145
{
142-
_shortMeasurementCallback = (measurementCallback is null) ? ((instrument, measurement, tags, state) => { /* no-op */}) : shortCallback;
146+
_shortMeasurementCallback = (MeasurementCallback<short>)(object)measurementCallback;
143147
}
144-
else if (measurementCallback is MeasurementCallback<long> longCallback)
148+
else if (typeof(T) == typeof(long))
145149
{
146-
_longMeasurementCallback = (measurementCallback is null) ? ((instrument, measurement, tags, state) => { /* no-op */}) : longCallback;
150+
_longMeasurementCallback = (MeasurementCallback<long>)(object)measurementCallback;
147151
}
148152
else
149153
{

src/libraries/System.Diagnostics.DiagnosticSource/tests/MetricsTests.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -894,6 +894,36 @@ public void MultipleListenersTest()
894894
}).Dispose();
895895
}
896896

897+
[ConditionalFact(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))]
898+
public void NullMeasurementEventCallbackTest()
899+
{
900+
RemoteExecutor.Invoke(() => {
901+
Meter meter = new Meter("NullMeasurementEventCallbackTest");
902+
903+
Counter<int> counter = meter.CreateCounter<int>("Counter");
904+
905+
MeterListener listener = new MeterListener();
906+
907+
listener.InstrumentPublished = (theInstrument, theListener) => theListener.EnableMeasurementEvents(theInstrument, theInstrument);
908+
909+
int count = 0;
910+
listener.SetMeasurementEventCallback<int>((inst, measurement, tags, state) => count++);
911+
912+
listener.Start();
913+
914+
Assert.Equal(0, count);
915+
916+
counter.Add(1);
917+
Assert.Equal(1, count);
918+
919+
listener.SetMeasurementEventCallback<int>(null);
920+
counter.Add(1);
921+
Assert.Equal(1, count);
922+
923+
Assert.Throws<InvalidOperationException>(() => listener.SetMeasurementEventCallback<ulong>(null));
924+
}).Dispose();
925+
}
926+
897927
[ConditionalFact(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))]
898928
public void EnableListeneingMultipleTimesWithDifferentState()
899929
{

0 commit comments

Comments
 (0)