So many years using Xojo, and still finding new weird behaviors. I have console app that manages a bunch of sockets. Socket events fire on the main thread, unless you’re polling them. I’m not. Being a console app, I have a single DoEvents loop in the Run event handler. While I fully understand that I cannot count on event order, I’m having a situation where the error event of a socket sometimes gets added to the existing stack instead of waiting for the next iteration of the event loop.
Take this log output for example:
ExchangeSocket.mRconSocket_Disconnected: RCON has disconnected
ExchangeSocket.Error: Unexpected disconnect, calling Cleanup
ExchangeSocket.Cleanup: Cleanup started
ExchangeSocket.Cleanup: Cleanup finished
ExchangeSocket.mRconSocket_Disconnected: RCON cleanup complete
These are independent methods that I’ve confirmed are definitely both firing on the main thread. But while executing the code for ExchangeSocket.mRconSocket_Disconnected
, ExchangeSocket.Error
has fired. You can see that in this stack trace here:
The code is in Sentinel.Service.SaveTo
, but ExchangeSocket.Event.Error
has just decided it’s going to be run. I’d expect at a loop boundary, but in this case the calling line is a SelectSQL. And no, the line doesn’t actually call the event. That’s just where the event has been injected into the stack.
This is code from ExchangeSocket.mRconSocket_Disconnected
. You can see the DebugPrint at the top, though the Terminal is obscuring a successful usage of Self.mService
just above that if. When that line was called, Self.mService
was not nil. But then “Unexpected disconnect” is called, which I know sets Self.mService
to nil as part of cleanup, and then back in mRconSocket_Disconnected
, Self.mService
is now nil.
This is macOS ARM 2025r1.1. I can’t even think of a way to counter this. It just shouldn’t be happening.