From f08f26f8885f9cbf39f967b51f26de47c201f4da Mon Sep 17 00:00:00 2001 From: Rone Charles Date: Sun, 21 Apr 2024 14:44:12 -0400 Subject: [PATCH] Allow bowtie2 to continue trying after partial writes, use perror for write errors for better debugging --- filebuf.h | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/filebuf.h b/filebuf.h index 4aec9e87..3858aec7 100644 --- a/filebuf.h +++ b/filebuf.h @@ -951,16 +951,27 @@ class OutFileBuf { static void writeAsync(AsyncData *asyncDataPtr) { AsyncData &asyncData = *asyncDataPtr; bool abort = false; + size_t written = 0; while(!abort) { abort = asyncData.waitForBuf(); if(abort) break; - if(asyncData.cur != fwrite((const void *)asyncData.buf, 1, asyncData.cur, asyncData.out)) { + while (asyncData.cur != 0) { + written += fwrite((const void *)(asyncData.buf + written), 1, asyncData.cur, asyncData.out); if (errno == EPIPE) { exit(EXIT_SUCCESS); } - std::cerr << "Error while flushing and closing output" << std::endl; - throw 1; + if (feof(asyncData.out) || written == 0) + break; + // asyncData.buf += written; + asyncData.cur -= written; + written = 0; } + + if (written != asyncData.cur) { + // std::cerr << "Error while flushing and closing output" << std::endl; + perror("fwrite"); + throw 1; + } abort = asyncData.writeComplete(); }