extract.c: Send "extract streams" progress at least every 5 MB
authorEric Biggers <ebiggers3@gmail.com>
Tue, 24 Jun 2014 00:47:37 +0000 (19:47 -0500)
committerEric Biggers <ebiggers3@gmail.com>
Tue, 24 Jun 2014 00:47:37 +0000 (19:47 -0500)
NEWS
src/extract.c

diff --git a/NEWS b/NEWS
index a903d01f033a8a05a296cc80ff6a624890691782..74052dc345e7e024784c68f31f08604b652ff773 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,8 +5,9 @@ Version 1.7.1-BETA:
        Library users can now initialize and de-initialize the library multiple
        times in one run of an application program.
 
-       Library users will now receive WIMLIB_PROGRESS_MSG_WRITE_STREAMS
-       messages more frequently when writing large WIM files.
+       Library users will now receive WIMLIB_PROGRESS_MSG_WRITE_STREAMS and
+       WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS messages more frequently when
+       writing or extracting large WIM files.
 
        Added experimental new write flag:
        WIMLIB_WRITE_FLAG_SEND_DONE_WITH_FILE_MESSAGES.
index 383aaf710337eba80e051de87202f655b7b67eb7..e62fa8a890cc27927f9fbe22290db85045d9cb8b 100644 (file)
@@ -355,8 +355,23 @@ extract_chunk_wrapper(const void *chunk, size_t size, void *_ctx)
                {
                        ctx->next_progress = UINT64_MAX;
                } else {
-                       ctx->next_progress += progress->extract.total_bytes / 128;
-                       if (ctx->next_progress > progress->extract.total_bytes)
+                       /* Send new message as soon as another 1/128 of the
+                        * total has been extracted.  (Arbitrary number.)  */
+                       ctx->next_progress =
+                               progress->extract.completed_bytes +
+                                       progress->extract.total_bytes / 128;
+
+                       /* ... Unless that would be more than 5000000 bytes, in
+                        * which case send the next after the next 5000000
+                        * bytes.  (Another arbitrary number.)  */
+                       if (progress->extract.completed_bytes + 5000000 <
+                           ctx->next_progress)
+                               ctx->next_progress =
+                                       progress->extract.completed_bytes + 5000000;
+
+                       /* ... But always send a message as soon as we're
+                        * completely done.  */
+                       if (progress->extract.total_bytes < ctx->next_progress)
                                ctx->next_progress = progress->extract.total_bytes;
                }
        }