mirror of
https://github.com/ckolivas/lrzip.git
synced 2025-12-06 07:12:00 +01:00
Don't wait on a semaphore the 2nd time attempting to compress/decompress.
Wait for all ucompthreads to be free. Destroy the semaphores used by ucompthreads when a stream_in is closed.
This commit is contained in:
parent
351cfced8a
commit
34f76fa73c
27
stream.c
27
stream.c
|
|
@ -960,7 +960,7 @@ retry:
|
||||||
print_maxverbose("Unable to compress in parallel, waiting for previous thread to complete before trying again\n");
|
print_maxverbose("Unable to compress in parallel, waiting for previous thread to complete before trying again\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (control.threads > 1)
|
if (control.threads > 1 && !waited)
|
||||||
wait_sem(&cthread[cti->wait_on].complete);
|
wait_sem(&cthread[cti->wait_on].complete);
|
||||||
waited = 1;
|
waited = 1;
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
@ -1093,12 +1093,20 @@ retry:
|
||||||
print_maxverbose("Unable to decompress in parallel, waiting for previous thread to complete before trying again\n");
|
print_maxverbose("Unable to decompress in parallel, waiting for previous thread to complete before trying again\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
post_sem(&uci->complete);
|
/* First ready, are up to this thread yet? */
|
||||||
wait_sem(&uci->ready);
|
if (!waited)
|
||||||
|
wait_sem(&uci->ready);
|
||||||
waited = 1;
|
waited = 1;
|
||||||
if (ret)
|
if (ret)
|
||||||
goto retry;
|
goto retry;
|
||||||
|
|
||||||
|
/* This complete tells the main thread that this thread has its
|
||||||
|
* decompressed data ready */
|
||||||
|
post_sem(&uci->complete);
|
||||||
|
/* Second ready, the buffer has been grabbed by the main thread so this
|
||||||
|
* thread can exit */
|
||||||
|
wait_sem(&uci->ready);
|
||||||
|
|
||||||
print_maxverbose("Thread %ld returning %lld uncompressed bytes from stream %d\n", i, uci->u_len, uci->stream);
|
print_maxverbose("Thread %ld returning %lld uncompressed bytes from stream %d\n", i, uci->u_len, uci->stream);
|
||||||
post_sem(&uci->free);
|
post_sem(&uci->free);
|
||||||
|
|
||||||
|
|
@ -1184,12 +1192,18 @@ fill_another:
|
||||||
goto fill_another;
|
goto fill_another;
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
|
/* This ready tells the decompression thread we're up to it */
|
||||||
|
post_sem(&ucthread[s->unext_thread].ready);
|
||||||
|
/* This complete is the deco thread telling us it's finished
|
||||||
|
* decompressing data */
|
||||||
wait_sem(&ucthread[s->unext_thread].complete);
|
wait_sem(&ucthread[s->unext_thread].complete);
|
||||||
|
|
||||||
s->buf = ucthread[s->unext_thread].s_buf;
|
s->buf = ucthread[s->unext_thread].s_buf;
|
||||||
s->buflen = ucthread[s->unext_thread].u_len;
|
s->buflen = ucthread[s->unext_thread].u_len;
|
||||||
s->bufp = 0;
|
s->bufp = 0;
|
||||||
|
|
||||||
|
/* This ready tells the decompression thread we've taken the buffer so
|
||||||
|
* it can exit */
|
||||||
post_sem(&ucthread[s->unext_thread].ready);
|
post_sem(&ucthread[s->unext_thread].ready);
|
||||||
|
|
||||||
if (++s->unext_thread == s->base_thread + s->total_threads)
|
if (++s->unext_thread == s->base_thread + s->total_threads)
|
||||||
|
|
@ -1284,6 +1298,13 @@ int close_stream_in(void *ss)
|
||||||
for (i = 0; i < sinfo->num_streams; i++)
|
for (i = 0; i < sinfo->num_streams; i++)
|
||||||
free(sinfo->s[i].buf);
|
free(sinfo->s[i].buf);
|
||||||
|
|
||||||
|
for (i = 0; i < control.threads + 1; i++) {
|
||||||
|
wait_sem(&ucthread[i].free);
|
||||||
|
destroy_sem(&ucthread[i].complete);
|
||||||
|
destroy_sem(&ucthread[i].free);
|
||||||
|
destroy_sem(&ucthread[i].ready);
|
||||||
|
}
|
||||||
|
|
||||||
free(ucthread);
|
free(ucthread);
|
||||||
free(threads);
|
free(threads);
|
||||||
free(sinfo->s);
|
free(sinfo->s);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue