diff --git a/common.c b/common.c index dd32314..b637d2b 100644 --- a/common.c +++ b/common.c @@ -333,6 +333,8 @@ queue_t *gPipelineStartQ = NULL, *gPipelineSplitQ = NULL, *gPipelineMergeQ = NULL; +size_t gPipelineProcessMax = 0; + pipeline_data_free_t gPLFreer = NULL; pipeline_split_t gPLSplit = NULL; pipeline_process_t gPLProcess = NULL; @@ -367,6 +369,9 @@ void pipeline_create( gPLMergedItems = NULL; gPLProcessCount = num_threads(); + if (gPipelineProcessMax > 0 && gPipelineProcessMax < gPLProcessCount) + gPLProcessCount = gPipelineProcessMax; + gPLProcessThreads = malloc(gPLProcessCount * sizeof(pthread_t)); for (size_t i = 0; i < (int)(gPLProcessCount * 2 + 3); ++i) { // create blocks, including a margin of error diff --git a/pixz.c b/pixz.c index 130dc37..b81bde8 100644 --- a/pixz.c +++ b/pixz.c @@ -55,7 +55,9 @@ int main(int argc, char **argv) { char *ipath = NULL, *opath = NULL; int ch; - while ((ch = getopt(argc, argv, "dxli:o:tvh0123456789")) != -1) { + char *optend; + long optint; + while ((ch = getopt(argc, argv, "dxli:o:tvhp:0123456789")) != -1) { switch (ch) { case 'd': op = OP_READ; break; case 'x': op = OP_EXTRACT; break; @@ -63,7 +65,13 @@ int main(int argc, char **argv) { case 'i': ipath = optarg; break; case 'o': opath = optarg; break; case 't': tar = false; break; - case 'h': usage(NULL); + case 'h': usage(NULL); break; + case 'p': + optint = strtol(optarg, &optend, 10); + if (optint < 0 || *optend) + usage("Need a non-negative integer argument to -p"); + gPipelineProcessMax = optint; + break; default: if (ch >= '0' && ch <= '9') { level = ch - '0'; diff --git a/pixz.h b/pixz.h index 79f5060..daacd97 100644 --- a/pixz.h +++ b/pixz.h @@ -106,6 +106,7 @@ int queue_pop(queue_t *q, void **datap); #pragma mark PIPELINE +extern size_t gPipelineProcessMax; extern queue_t *gPipelineStartQ, *gPipelineSplitQ, *gPipelineMergeQ; typedef enum {