]> mj.ucw.cz Git - libucw.git/blobdiff - lib/sorter/sbuck.c
Really deallocate the big_buf when radix-splitting.
[libucw.git] / lib / sorter / sbuck.c
index ff9e9efa47a0fd7753203736689796866c878e0f..515115e282533e9ed00454b23e771ae13c76a4e9 100644 (file)
@@ -10,6 +10,7 @@
 #include "lib/lib.h"
 #include "lib/fastbuf.h"
 #include "lib/mempool.h"
 #include "lib/lib.h"
 #include "lib/fastbuf.h"
 #include "lib/mempool.h"
+#include "lib/stkstring.h"
 #include "lib/sorter/common.h"
 
 #include <fcntl.h>
 #include "lib/sorter/common.h"
 
 #include <fcntl.h>
@@ -68,7 +69,10 @@ sbuck_swap_in(struct sort_bucket *b)
 {
   if (b->flags & SBF_SWAPPED_OUT)
     {
 {
   if (b->flags & SBF_SWAPPED_OUT)
     {
-      b->fb = bopen(b->filename, O_RDWR, sorter_stream_bufsize);
+      if (sorter_stream_bufsize)       /* FIXME: Needs better configuration, probably semi-automatic one */
+       b->fb = bopen(b->filename, O_RDWR, sorter_stream_bufsize);
+      else
+       b->fb = fbdir_open(b->filename, O_RDWR, NULL);
       if (b->flags & SBF_OPEN_WRITE)
        bseek(b->fb, 0, SEEK_END);
       bconfig(b->fb, BCONFIG_IS_TEMP_FILE, 1);
       if (b->flags & SBF_OPEN_WRITE)
        bseek(b->fb, 0, SEEK_END);
       bconfig(b->fb, BCONFIG_IS_TEMP_FILE, 1);
@@ -103,7 +107,10 @@ sbuck_write(struct sort_bucket *b)
   else
     {
       ASSERT(!(b->flags & (SBF_OPEN_READ | SBF_DESTROYED)));
   else
     {
       ASSERT(!(b->flags & (SBF_OPEN_READ | SBF_DESTROYED)));
-      b->fb = bopen_tmp(sorter_stream_bufsize);
+      if (sorter_stream_bufsize)
+       b->fb = bopen_tmp(sorter_stream_bufsize);
+      else
+       b->fb = fbdir_open_tmp(NULL);
       if (sorter_debug & SORT_DEBUG_KEEP_BUCKETS)
        bconfig(b->fb, BCONFIG_IS_TEMP_FILE, 0);
       b->flags |= SBF_OPEN_WRITE;
       if (sorter_debug & SORT_DEBUG_KEEP_BUCKETS)
        bconfig(b->fb, BCONFIG_IS_TEMP_FILE, 0);
       b->flags |= SBF_OPEN_WRITE;
@@ -128,17 +135,22 @@ sbuck_swap_out(struct sort_bucket *b)
 }
 
 void
 }
 
 void
-sorter_alloc_buf(struct sort_context *ctx)
+sorter_prepare_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);
   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_size = 2*bs;
-  ctx->big_buf_half = ((byte*) ctx->big_buf) + bs;
   ctx->big_buf_half_size = bs;
   ctx->big_buf_half_size = bs;
-  SORT_XTRACE(2, "Allocated sorting buffer (%jd bytes)", (uintmax_t) bs);
+}
+
+void
+sorter_alloc_buf(struct sort_context *ctx)
+{
+  if (ctx->big_buf)
+    return;
+  ctx->big_buf = big_alloc(ctx->big_buf_size);
+  ctx->big_buf_half = ((byte*) ctx->big_buf) + ctx->big_buf_half_size;
+  SORT_XTRACE(2, "Allocated sorting buffer (2*%s)", stk_fsize(ctx->big_buf_half_size));
 }
 
 void
 }
 
 void
@@ -150,20 +162,3 @@ sorter_free_buf(struct sort_context *ctx)
   ctx->big_buf = NULL;
   SORT_XTRACE(2, "Freed sorting buffer");
 }
   ctx->big_buf = NULL;
   SORT_XTRACE(2, "Freed sorting buffer");
 }
-
-void
-format_size(byte *buf, u64 x)
-{
-  if (x < 10<<10)
-    sprintf(buf, "%.1fK", (double)x/(1<<10));
-  else if (x < 1<<20)
-    sprintf(buf, "%dK", (int)(x/(1<<10)));
-  else if (x < 10<<20)
-    sprintf(buf, "%.1fM", (double)x/(1<<20));
-  else if (x < 1<<30)
-    sprintf(buf, "%dM", (int)(x/(1<<20)));
-  else if (x < (u64)10<<30)
-    sprintf(buf, "%.1fG", (double)x/(1<<30));
-  else
-    sprintf(buf, "%dG", (int)(x/(1<<30)));
-}