From: Martin Mares Date: Tue, 11 Sep 2007 16:59:29 +0000 (+0200) Subject: Adjust thread stack size according to radix sorter parameters. X-Git-Tag: holmes-import~506^2~13^2~11 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=568071c379af91c725b3db1da2c615bd4a203e93;p=libucw.git Adjust thread stack size according to radix sorter parameters. --- diff --git a/lib/sorter/TODO b/lib/sorter/TODO index 32bd56fe..a3193083 100644 --- a/lib/sorter/TODO +++ b/lib/sorter/TODO @@ -3,7 +3,6 @@ o Clean up introductory comments. o Log messages should show both original and new size of the data. The speed should be probably calculated from the former. o Buffer sizing in shep-export. -o Problems with thread stack limit in radix-sorting of arrays. Users of lib/sorter/array.h which might use radix-sorting: indexer/chewer.c diff --git a/lib/sorter/array.c b/lib/sorter/array.c index 68ada901..4d64d758 100644 --- a/lib/sorter/array.c +++ b/lib/sorter/array.c @@ -75,6 +75,15 @@ static uns asort_threads_use_count; static uns asort_threads_ready; static struct worker_pool asort_thread_pool; +static uns +rs_estimate_stack(void) +{ + // Stack space needed by the recursive radix-sorter + uns ctrsize = sizeof(uns) * (1 << CONFIG_UCW_RADIX_SORTER_BITS); + uns maxdepth = (64 / CONFIG_UCW_RADIX_SORTER_BITS) + 1; + return ctrsize * maxdepth; +} + void asort_start_threads(uns run) { @@ -82,8 +91,11 @@ asort_start_threads(uns run) asort_threads_use_count++; if (run && !asort_threads_ready) { - ASORT_TRACE("Initializing thread pool (%d threads)", sorter_threads); + // XXX: If somebody overrides the radix-sorter parameters to insane values, + // he also should override the stack size to insane values. + asort_thread_pool.stack_size = default_thread_stack_size + rs_estimate_stack(); asort_thread_pool.num_threads = sorter_threads; + ASORT_TRACE("Initializing thread pool (%d threads, %dK stack)", sorter_threads, asort_thread_pool.stack_size >> 10); worker_pool_init(&asort_thread_pool); asort_threads_ready = 1; }