Factor out the bits that run with the sock I/O lock held into a separate
function. In this implementation, we are doing a bit more work under
the I/O lock than before. However, lock contention is only a problem
when multiple threads are transmitting on the same socket, which is an
unusual case that is not expected to perform well in any case.
No functional change intended.