]> mj.ucw.cz Git - libucw.git/blobdiff - lib/sorter.h
Merge with git+ssh://git.ucw.cz/projects/sherlock/GIT/sherlock.git
[libucw.git] / lib / sorter.h
index 04243318d8ea876c87be35e02131d75320f4a6df..eebd2206dfdee76c2d1ee10f84d3036f826cf954 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *     Sherlock Library -- Universal Sorter
+ *     UCW Library -- Universal Sorter
  *
  *     (c) 2001--2004 Martin Mares <mj@ucw.cz>
  *     (c) 2004 Robert Spalek <robert@ucw.cz>
@@ -50,7 +50,7 @@
  *  int PREFIX_compare(SORT_KEY *a, *b)
  *                     compare two keys, result like strcmp
  *  int PREFIX_fetch_key(struct fastbuf *f, SORT_KEY *k)
- *                     fetch next key, returns 1=ok, 0=eof
+ *                     fetch next key, returns nonzero=ok, 0=eof
  *  void PREFIX_copy_data(struct fastbuf *src, *dest, SORT_KEY *k)
  *                     write just fetched key k to dest and copy all data
  *                     belonging to this key from src to dest.
  *  undef'd.
  */
 
-/* Declarations of externals from sorter.c */
-
-#ifndef SORT_DECLS_READ
-#define SORT_DECLS_READ
-
-extern uns sorter_trace;
-extern uns sorter_presort_bufsize;
-extern uns sorter_stream_bufsize;
-
-extern uns sorter_pass_counter;
-
-#endif         /* !SORT_DECLS_READ */
-
-/* The sorter proper */
-
-#ifndef SORT_DECLARE_ONLY
-
+#include "lib/sorter-globals.h"
 #include "lib/fastbuf.h"
 #include <unistd.h>
 #include <fcntl.h>
@@ -246,7 +230,7 @@ P(pass)(struct fastbuf **fb1, struct fastbuf **fb2
   bclose(in1);
   bclose(in2);
   if (sorter_trace)
-    log(L_INFO, "Pass %d: %d runs, %d+%d KB", sorter_pass_counter, run_count,
+    msg(L_INFO, "Pass %d: %d runs, %d+%d KB", sorter_pass_counter, run_count,
        (out1 ? (int)((btell(out1) + 1023) / 1024) : 0),
        (out2 ? (int)((btell(out2) + 1023) / 1024) : 0));
   *fb1 = P(flush_out)(out1);
@@ -279,7 +263,7 @@ P(presort)(struct fastbuf **fb1, struct fastbuf **fb2)
   struct fastbuf *tbuf;
   uns buf_items = sorter_presort_bufsize / sizeof(SORT_KEY);
   uns run_count = 0;
-  SORT_KEY last_out, *array;
+  SORT_KEY last_out = { }, *array;
 
   ASSERT(!*fb2);
   if (buf_items < 2)
@@ -304,7 +288,7 @@ P(presort)(struct fastbuf **fb1, struct fastbuf **fb2)
        {
          run_count++;
 #ifdef SORT_UP_TO
-         if (sorter_presort_bufsize < SORT_UP_TO)
+         if (sorter_presort_bufsize < (uns) SORT_UP_TO)
 #endif
            SWAP(out1, out2, tbuf);
          if (!out1)
@@ -316,7 +300,7 @@ P(presort)(struct fastbuf **fb1, struct fastbuf **fb2)
 
   bclose(in);
   if (sorter_trace)
-    log(L_INFO, "Pass 0: %d runs, %d+%d KB",
+    msg(L_INFO, "Pass 0: %d runs, %d+%d KB",
        run_count,
        (out1 ? (int)((btell(out1) + 1023) / 1024) : 0),
        (out2 ? (int)((btell(out2) + 1023) / 1024) : 0));
@@ -417,7 +401,7 @@ P(presort)(struct fastbuf **fb1, struct fastbuf **fb2)
        }
       for(;;)
        {
-         current = (byte *) ALIGN((addr_int_t) current, CPU_STRUCT_ALIGN);
+         current = (byte *) ALIGN_TO((uintptr_t) current, CPU_STRUCT_ALIGN);
          if (current + sizeof(*this) > bufend)
            break;
          this = (SORT_NODE *) current;
@@ -475,7 +459,7 @@ P(presort)(struct fastbuf **fb1, struct fastbuf **fb2)
 
   bclose(in);
   if (sorter_trace)
-    log(L_INFO, "Pass 0: %d runs (%d giants, %d splits), %d+%d KB",
+    msg(L_INFO, "Pass 0: %d runs (%d giants, %d splits), %d+%d KB",
        run_count, giant_count, split_count,
        (out1 ? (int)((btell(out1) + 1023) / 1024) : 0),
        (out2 ? (int)((btell(out2) + 1023) / 1024) : 0));
@@ -531,11 +515,16 @@ struct fastbuf *fb1, struct fastbuf *fb2
     do P(pass)(&fb1, &fb2); while (fb1 && fb2);
 #else
     {
-      sh_off_t run_count = ~1LLU, max_run_count = 0;
+      sh_off_t run_count, max_run_count = 0;
       if (fb1)
        max_run_count += bfilesize(fb1);
       if (fb2)
        max_run_count += bfilesize(fb2);
+#ifdef SORT_PRESORT
+      run_count = max_run_count / sorter_presort_bufsize;
+#else
+      run_count = max_run_count;
+#endif
       if (SORT_UP_TO)
        max_run_count /= SORT_UP_TO;
       do
@@ -574,5 +563,3 @@ struct fastbuf *fb1, struct fastbuf *fb2
 #undef SORT_OUTPUT_FB
 #undef SORT_PRESORT
 #undef SORT_UP_TO
-
-#endif         /* !SORT_DECLARE_ONLY */