- /*
- * Keep writing data until the OS has to actually start an async IO
- * for it. At that point we know the buffer is full.
- */
- while (written < count) {
- /* Copy first byte of user buffer. */
- port->pending_byte = *ptr++;
-
- /* Start asynchronous write. */
- if (WriteFile(port->hdl, &port->pending_byte, 1, NULL, &port->write_ovl) == 0) {
- if (GetLastError() == ERROR_IO_PENDING) {
- if (HasOverlappedIoCompleted(&port->write_ovl)) {
- DEBUG("Asynchronous write completed immediately");
- port->writing = 0;
- written++;
- continue;
- } else {
- DEBUG("Asynchronous write running");
- port->writing = 1;
- RETURN_INT(++written);
- }
- } else {
- /* Actual failure of some kind. */
- RETURN_FAIL("WriteFile() failed");
- }
+ /* Copy data to our write buffer. */
+ buf_bytes = min(port->write_buf_size, count);
+ memcpy(port->write_buf, buf, buf_bytes);
+
+ /* Start asynchronous write. */
+ if (WriteFile(port->hdl, port->write_buf, buf_bytes, NULL, &port->write_ovl) == 0) {
+ if (GetLastError() == ERROR_IO_PENDING) {
+ if ((port->writing = !HasOverlappedIoCompleted(&port->write_ovl)))
+ DEBUG("Asynchronous write completed immediately");
+ else
+ DEBUG("Asynchronous write running");