]> wimlib.net Git - wimlib/blobdiff - src/resource.c
Multithreaded stream writing fixes
[wimlib] / src / resource.c
index dc5b7a806fe24d3bb61aad2bb5528ffd787e2a18..1b53ee40342cf6f5258b4b9bd0b508d4f8fc4500 100644 (file)
@@ -320,11 +320,11 @@ read_compressed_resource(FILE *fp,
                 * is equal to the uncompressed chunk size. */
                if (compressed_chunk_size == uncompressed_chunk_size) {
                        /* Uncompressed chunk */
-
                        if (start_offset != 0)
                                if (fseeko(fp, start_offset, SEEK_CUR))
                                        goto read_error;
-                       if (fread(out_p, 1, partial_chunk_size, fp) != partial_chunk_size)
+                       if (fread(cb ? out_p + start_offset : out_p,
+                                 1, partial_chunk_size, fp) != partial_chunk_size)
                                goto read_error;
                } else {
                        /* Compressed chunk */
@@ -463,7 +463,7 @@ put_resource_entry(void *p, const struct resource_entry *entry)
 static FILE *
 wim_get_fp(WIMStruct *w)
 {
-#ifdef WITH_FUSE
+#if defined(WITH_FUSE) || defined(ENABLE_MULTITHREADED_COMPRESSION)
        pthread_mutex_lock(&w->fp_tab_mutex);
        FILE *fp;
 
@@ -482,9 +482,9 @@ wim_get_fp(WIMStruct *w)
                ERROR_WITH_ERRNO("Failed to open `%"TS"'", w->filename);
 out_unlock:
        pthread_mutex_unlock(&w->fp_tab_mutex);
-#else /* WITH_FUSE */
+#else /* WITH_FUSE || ENABLE_MULTITHREADED_COMPRESSION */
        fp = w->fp;
-#endif /* !WITH_FUSE */
+#endif /* !WITH_FUSE && !ENABLE_MULTITHREADED_COMPRESSION */
        return fp;
 }
 
@@ -492,7 +492,7 @@ static int
 wim_release_fp(WIMStruct *w, FILE *fp)
 {
        int ret = 0;
-#ifdef WITH_FUSE
+#if defined(WITH_FUSE) || defined(ENABLE_MULTITHREADED_COMPRESSION)
        FILE **fp_tab;
 
        pthread_mutex_lock(&w->fp_tab_mutex);
@@ -516,7 +516,7 @@ wim_release_fp(WIMStruct *w, FILE *fp)
        w->num_allocated_fps += 4;
 out_unlock:
        pthread_mutex_unlock(&w->fp_tab_mutex);
-#endif /* WITH_FUSE */
+#endif /* WITH_FUSE || ENABLE_MULTITHREADED_COMPRESSION */
        return ret;
 }
 
@@ -533,22 +533,18 @@ read_partial_wim_resource(const struct wim_lookup_table_entry *lte,
        int ret;
 
        wimlib_assert(lte->resource_location == RESOURCE_IN_WIM);
-       wimlib_assert(offset + size <= lte->resource_entry.original_size);
 
        wim = lte->wim;
-
        if (flags & WIMLIB_RESOURCE_FLAG_THREADSAFE_READ) {
                wim_fp = wim_get_fp(wim);
                if (!wim_fp) {
-                       ret = -1;
+                       ret = WIMLIB_ERR_READ;
                        goto out;
                }
        } else {
                wim_fp = lte->wim->fp;
        }
 
-       wimlib_assert(wim_fp != NULL);
-
        if (lte->resource_entry.flags & WIM_RESHDR_FLAG_COMPRESSED &&
            !(flags & WIMLIB_RESOURCE_FLAG_RAW))
        {
@@ -576,7 +572,7 @@ read_partial_wim_resource(const struct wim_lookup_table_entry *lte,
                        while (size) {
                                size_t bytes_to_read = min(WIM_CHUNK_SIZE, size);
                                size_t bytes_read = fread(buf, 1, bytes_to_read, wim_fp);
-                               
+
                                if (bytes_read != bytes_to_read)
                                        goto read_error;
                                ret = cb(buf, bytes_read, ctx_or_buf);
@@ -593,15 +589,17 @@ read_partial_wim_resource(const struct wim_lookup_table_entry *lte,
        }
        goto out_release_fp;
 read_error:
-       if (ferror(wim_fp)) {
+       if (ferror(wim_fp))
                ERROR_WITH_ERRNO("Error reading data from WIM");
-       } else {
+       else
                ERROR("Unexpected EOF in WIM!");
-       }
        ret = WIMLIB_ERR_READ;
 out_release_fp:
-       if (flags & WIMLIB_RESOURCE_FLAG_THREADSAFE_READ)
-               ret |= wim_release_fp(wim, wim_fp);
+       if (flags & WIMLIB_RESOURCE_FLAG_THREADSAFE_READ) {
+               int ret2 = wim_release_fp(wim, wim_fp);
+               if (ret == 0)
+                       ret = ret2;
+       }
 out:
        if (ret) {
                if (errno == 0)
@@ -850,6 +848,7 @@ sha1_chunk(const void *buf, size_t len, void *ctx)
        return 0;
 }
 
+/* Calculate the SHA1 message digest of a stream. */
 int
 sha1_resource(struct wim_lookup_table_entry *lte)
 {