| 110 | #define DOIO_ONCE(iocb, waitcb) doio_once(LAMBDA(iocb), LAMBDA(waitcb)) |
| 111 | |
| 112 | template <typename IOCB, typename STEP> __FORCE_INLINE__ |
| 113 | ssize_t doio_loop(IOCB iocb, STEP step) { |
| 114 | ssize_t ret, n = 0; |
| 115 | do { |
| 116 | ret = iocb(); |
| 117 | if (ret < 0) return ret; // error |
| 118 | if (ret == 0) break; // EOF |
| 119 | n += ret; |
| 120 | } while (step(ret, n)); |
| 121 | return n; |
| 122 | } |
| 123 | |
| 124 | struct BufStep { |
| 125 | void*& buf; |