Wire library and blocking read/writes

Hi,
I must admit I haven't read all of your posting, but I have my doubts that you really found a bug in the Wire-lib, since this code hasn't been updated for years and is in use by thousands of projects.

I would look for problems on the slave-side rather than on the Arduino side.

The fastes easiest way to find out what is happening would be to hook up a logic-analyzer to the signals and see if the communication follows the (well-defined) I²C-protocol.
But since this nothing to be found in everybodys household ....

The only situation where the (arduino-) master must wait endlessly for a slave device, is when the slave pull the SCL-Line low during clock-stretching. I²C - Wikipedia

If the compass module never releases that line, this is a software/hardware-bug on the slave side.

That a powered down compass module also seems to stall the complete communication also sounds like a hardware bug on the compass side. I don't know if the I²C-Protocol says anything about this situation, but I never had a slave device the acted that way.

And the I²C-Bus supports up to 127 devices. I does not make any sense that a failure in one slave device should bring the whole bus down

Eberhard