X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=inline;f=lib%2Fsorter%2Fsbuck.c;h=e506e3189161d905ca4a1408df789f799b4c86bc;hb=54833f693e97cc4c3d5b8c28e6816e8d1ce5192e;hp=0895840112644e1149364af4741f3c94e2890c5c;hpb=6d00600fd0121cd3361843ca803fab0b2b76a7d8;p=libucw.git diff --git a/lib/sorter/sbuck.c b/lib/sorter/sbuck.c index 08958401..e506e318 100644 --- a/lib/sorter/sbuck.c +++ b/lib/sorter/sbuck.c @@ -10,6 +10,7 @@ #include "lib/lib.h" #include "lib/fastbuf.h" #include "lib/mempool.h" +#include "lib/stkstring.h" #include "lib/sorter/common.h" #include @@ -68,12 +69,12 @@ sbuck_swap_in(struct sort_bucket *b) { if (b->flags & SBF_SWAPPED_OUT) { - b->fb = bopen(b->filename, O_RDWR, sorter_stream_bufsize); + b->fb = bopen_file(b->filename, O_RDWR, &sorter_fb_params); /* FIXME: Something different for small buckets? */ if (b->flags & SBF_OPEN_WRITE) bseek(b->fb, 0, SEEK_END); bconfig(b->fb, BCONFIG_IS_TEMP_FILE, 1); b->flags &= ~SBF_SWAPPED_OUT; - SORT_XTRACE("Swapped in %s", b->filename); + SORT_XTRACE(2, "Swapped in %s", b->filename); } } @@ -103,7 +104,9 @@ sbuck_write(struct sort_bucket *b) else { ASSERT(!(b->flags & (SBF_OPEN_READ | SBF_DESTROYED))); - b->fb = bopen_tmp(sorter_stream_bufsize); + b->fb = bopen_tmp_file(&sorter_fb_params); + if (sorter_debug & SORT_DEBUG_KEEP_BUCKETS) + bconfig(b->fb, BCONFIG_IS_TEMP_FILE, 0); b->flags |= SBF_OPEN_WRITE; b->filename = mp_strdup(b->ctx->pool, b->fb->name); } @@ -113,7 +116,7 @@ sbuck_write(struct sort_bucket *b) void sbuck_swap_out(struct sort_bucket *b) { - if ((b->flags & (SBF_OPEN_READ | SBF_OPEN_WRITE)) && b->fb) + if ((b->flags & (SBF_OPEN_READ | SBF_OPEN_WRITE)) && b->fb && !(b->flags & SBF_SOURCE)) { if (b->flags & SBF_OPEN_WRITE) b->size = btell(b->fb); @@ -121,22 +124,26 @@ sbuck_swap_out(struct sort_bucket *b) bclose(b->fb); b->fb = NULL; b->flags |= SBF_SWAPPED_OUT; - SORT_XTRACE("Swapped out %s", b->filename); + SORT_XTRACE(2, "Swapped out %s", b->filename); } } +void +sorter_prepare_buf(struct sort_context *ctx) +{ + u64 bs = sorter_bufsize; + bs = ALIGN_TO(bs, (u64)CPU_PAGE_SIZE); + bs = MAX(bs, 2*(u64)CPU_PAGE_SIZE); + ctx->big_buf_size = bs; +} + void sorter_alloc_buf(struct sort_context *ctx) { if (ctx->big_buf) return; - u64 bs = MAX(sorter_bufsize/2, 1); - bs = ALIGN_TO(bs, (u64)CPU_PAGE_SIZE); - ctx->big_buf = big_alloc(2*bs); - ctx->big_buf_size = 2*bs; - ctx->big_buf_half = ((byte*) ctx->big_buf) + bs; - ctx->big_buf_half_size = bs; - SORT_XTRACE("Allocated sorting buffer (%jd bytes)", (uintmax_t) bs); + ctx->big_buf = big_alloc(ctx->big_buf_size); + SORT_XTRACE(2, "Allocated sorting buffer (%s)", stk_fsize(ctx->big_buf_size)); } void @@ -146,5 +153,5 @@ sorter_free_buf(struct sort_context *ctx) return; big_free(ctx->big_buf, ctx->big_buf_size); ctx->big_buf = NULL; - SORT_XTRACE("Freed sorting buffer"); + SORT_XTRACE(2, "Freed sorting buffer"); }