X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fsorter%2Fs-fixint.h;h=e2a24b5b2e39065533470039afc232990e79d90a;hb=ed088bedabfba6dc0e1f48f3ba750407cf96a1b3;hp=972f04004e8241f8af1c7bb0427d7d4de8770609;hpb=7119957a2df57af617f432dd429e1d6ae5cbe0fd;p=libucw.git diff --git a/lib/sorter/s-fixint.h b/lib/sorter/s-fixint.h index 972f0400..e2a24b5b 100644 --- a/lib/sorter/s-fixint.h +++ b/lib/sorter/s-fixint.h @@ -11,10 +11,15 @@ #define ASORT_PREFIX(x) SORT_PREFIX(array_##x) #define ASORT_KEY_TYPE P(key) -#define ASORT_ELT(i) ary[i] #define ASORT_LT(x,y) (P(compare)(&(x), &(y)) < 0) -#define ASORT_EXTRA_ARGS , P(key) *ary -#include "lib/arraysort.h" +#define ASORT_PAGE_ALIGNED +#ifdef SORT_INTERNAL_RADIX +# define ASORT_HASH(x) P(hash)(&(x)) +# ifdef SORT_LONG_HASH +# define ASORT_LONG_HASH +# endif +#endif +#include "lib/sorter/array.h" /* * This is a more efficient implementation of the internal sorter, @@ -28,10 +33,10 @@ static size_t P(internal_workspace)(void) { size_t workspace = 0; -#ifdef CONFIG_UNIFY +#ifdef SORT_UNIFY workspace = sizeof(P(key) *); #endif -#if 0 // FIXME: Workspace for radix-sort if needed +#ifdef SORT_INTERNAL_RADIX workspace = MAX(workspace, sizeof(P(key))); #endif return workspace; @@ -54,7 +59,7 @@ static int P(internal)(struct sort_context *ctx, struct sort_bucket *bin, struct P(key) *buf = ctx->big_buf; uns maxkeys = P(internal_num_keys)(ctx); - SORT_XTRACE(4, "s-fixint: Reading (maxkeys=%u)", maxkeys); + SORT_XTRACE(4, "s-fixint: Reading (maxkeys=%u, hash_bits=%d)", maxkeys, bin->hash_bits); uns n = 0; while (n < maxkeys && P(read_key)(in, &buf[n])) n++; @@ -68,7 +73,13 @@ static int P(internal)(struct sort_context *ctx, struct sort_bucket *bin, struct stk_fsize(n * P(internal_workspace)())); timestamp_t timer; init_timer(&timer); - P(array_sort)(n, buf); + buf = P(array_sort)(buf, n, +#ifdef SORT_INTERNAL_RADIX + workspace, bin->hash_bits +#else + NULL, 0 +#endif + ); ctx->total_int_time += get_timer(&timer); SORT_XTRACE(4, "s-fixint: Writing");