I would think that anything less than or equal to zero would indicate the timeout has occurred. I imagine something like this:

```c++
timespec timeout;
int64_t time_remaining = total_timeout.remaining();  // Does not throw
if (time_remaining < 0) {
  break;
}
timeout = timespec_from_ms(std::min(time_remaing, timeout_.inter_byte_timeout));
```

Another reason I don't want to use exceptions is performance, as the time required to throw an exception in C++ is highly compiler specific, and is one reason they do not use exceptions at all in real time systems. Again this is one of those things which is unlikely to be a performance problem in practice, but still something to consider.