Skip to content

Commit

Permalink
Avoid SerialPort IOLoop when there's no event handlers (dotnet#102829)
Browse files Browse the repository at this point in the history
  • Loading branch information
MrJul authored and mikelle-rogers committed Dec 4, 2024
1 parent 30c19ea commit 2301fd7
Showing 1 changed file with 41 additions and 4 deletions.
45 changes: 41 additions & 4 deletions src/libraries/System.IO.Ports/src/System/IO/Ports/SerialPort.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,14 @@ public partial class SerialPort : Component
private char[] _singleCharBuffer;

public event SerialErrorReceivedEventHandler ErrorReceived;
public event SerialPinChangedEventHandler PinChanged;

// handler for the underlying stream
// handlers for the underlying stream
private readonly SerialDataReceivedEventHandler _dataReceivedHandler;
private readonly SerialPinChangedEventHandler _pinChangedHandler;

private SerialDataReceivedEventHandler _dataReceived;
private SerialPinChangedEventHandler _pinChanged;

public event SerialDataReceivedEventHandler DataReceived
{
add
Expand Down Expand Up @@ -99,6 +101,35 @@ public event SerialDataReceivedEventHandler DataReceived
}
}

public event SerialPinChangedEventHandler PinChanged
{
add
{
bool wasNull = _pinChanged == null;
_pinChanged += value;

if (wasNull)
{
if (_internalSerialStream != null)
{
_internalSerialStream.PinChanged += _pinChangedHandler;
}
}
}
remove
{
_pinChanged -= value;

if (_pinChanged == null)
{
if (_internalSerialStream != null)
{
_internalSerialStream.PinChanged -= _pinChangedHandler;
}
}
}
}

//--- component properties---------------*

// ---- SECTION: public properties --------------*
Expand Down Expand Up @@ -511,6 +542,7 @@ public int WriteTimeout
public SerialPort()
{
_dataReceivedHandler = new SerialDataReceivedEventHandler(CatchReceivedEvents);
_pinChangedHandler = CatchPinChangedEvents;
}

public SerialPort(IContainer container) : this()
Expand Down Expand Up @@ -563,6 +595,7 @@ protected override void Dispose(bool disposing)
if (IsOpen)
{
_internalSerialStream.DataReceived -= _dataReceivedHandler;
_internalSerialStream.PinChanged -= _pinChangedHandler;
_internalSerialStream.Flush();
_internalSerialStream.Close();
_internalSerialStream = null;
Expand Down Expand Up @@ -601,7 +634,11 @@ public void Open()
_internalSerialStream.SetBufferSizes(_readBufferSize, _writeBufferSize);

_internalSerialStream.ErrorReceived += new SerialErrorReceivedEventHandler(CatchErrorEvents);
_internalSerialStream.PinChanged += new SerialPinChangedEventHandler(CatchPinChangedEvents);

if (_pinChanged != null)
{
_internalSerialStream.PinChanged += _pinChangedHandler;
}

if (_dataReceived != null)
{
Expand Down Expand Up @@ -1213,7 +1250,7 @@ private void CatchErrorEvents(object src, SerialErrorReceivedEventArgs e)

private void CatchPinChangedEvents(object src, SerialPinChangedEventArgs e)
{
SerialPinChangedEventHandler eventHandler = PinChanged;
SerialPinChangedEventHandler eventHandler = _pinChanged;
SerialStream stream = _internalSerialStream;

if ((eventHandler != null) && (stream != null))
Expand Down

0 comments on commit 2301fd7

Please sign in to comment.