[Groonga-commit] groonga/groonga at cdd3b04 [master] ii: fix an offset computation bug on INDEX_LARGE

Back to archive index
Kouhei Sutou null+****@clear*****
Fri Apr 5 18:29:44 JST 2019


Kouhei Sutou	2019-04-05 18:29:44 +0900 (Fri, 05 Apr 2019)

  Revision: cdd3b046bbe3611c97973896ccdb2e128702d0ad
  https://github.com/groonga/groonga/commit/cdd3b046bbe3611c97973896ccdb2e128702d0ad

  Message:
    ii: fix an offset computation bug on INDEX_LARGE

  Modified files:
    lib/grn_ii.h
    lib/ii.c

  Modified: lib/grn_ii.h (+5 -0)
===================================================================
--- lib/grn_ii.h    2019-04-05 17:22:38 +0900 (7a49df55d)
+++ lib/grn_ii.h    2019-04-05 18:29:44 +0900 (3490c9228)
@@ -53,8 +53,13 @@ struct _grn_ii {
 
 /* BGQ is buffer garbage queue? */
 #define GRN_II_BGQSIZE 16
+/* L is for logical? */
 #define GRN_II_MAX_LSEG           0x10000
+#define GRN_II_W_LSEG             16
+#define GRN_II_W_LOFFSET          (32 - GRN_II_W_LSEG)
 #define GRN_II_MAX_LSEG_EXTEND    0x10000
+#define GRN_II_W_LSEG_LARGE       17
+#define GRN_II_W_LOFFSET_LARGE    (32 - GRN_II_W_LSEG_LARGE)
 #define GRN_II_W_TOTAL_CHUNK      40
 #define GRN_II_W_CHUNK            22
 #define GRN_II_W_LEAST_CHUNK      (GRN_II_W_TOTAL_CHUNK - 32)

  Modified: lib/ii.c (+21 -7)
===================================================================
--- lib/ii.c    2019-04-05 17:22:38 +0900 (cd41e9340)
+++ lib/ii.c    2019-04-05 18:29:44 +0900 (91ab9f61c)
@@ -2330,14 +2330,20 @@ typedef struct {
   buffer_term terms[(S_SEGMENT - sizeof(buffer_header))/sizeof(buffer_term)];
 } buffer;
 
-/* L is for logical? */
+#define GRN_II_POS_LSEG_SHIFT_SIZE (32 - GRN_II_W_LSEG)
+#define GRN_II_POS_LSEG_SHIFT_SIZE_LARGE (32 - GRN_II_W_LSEG_LARGE)
+#define GRN_II_POS_LOFFSET_SHIFT_SIZE           \
+  ((16 - GRN_II_W_LOFFSET) + 2)
+#define GRN_II_POS_LOFFSET_SHIFT_SIZE_LARGE     \
+  ((16 - GRN_II_W_LOFFSET_LARGE) + 2)
+
 grn_inline static uint32_t
 grn_ii_pos_lseg(grn_ii *ii, uint32_t pos)
 {
   if (ii->header.common->flags & GRN_OBJ_INDEX_LARGE) {
-    return pos >> 17;
+    return pos >> GRN_II_POS_LSEG_SHIFT_SIZE_LARGE;
   } else {
-    return pos >> 16;
+    return pos >> GRN_II_POS_LSEG_SHIFT_SIZE;
   }
 }
 
@@ -2345,9 +2351,13 @@ grn_inline static uint32_t
 grn_ii_pos_loffset(grn_ii *ii, uint32_t pos)
 {
   if (ii->header.common->flags & GRN_OBJ_INDEX_LARGE) {
-    return (pos & 0xffff) << 3;
+    return
+      (pos & ((1 << GRN_II_W_LOFFSET_LARGE) - 1)) <<
+      GRN_II_POS_LOFFSET_SHIFT_SIZE_LARGE;
   } else {
-    return (pos & 0xffff) << 2;
+    return
+      (pos & ((1 << GRN_II_W_LOFFSET) - 1)) <<
+      GRN_II_POS_LOFFSET_SHIFT_SIZE;
   }
 }
 
@@ -2355,9 +2365,13 @@ grn_inline static uint32_t
 grn_ii_pos_pack(grn_ii *ii, uint32_t lseg, uint32_t loffset)
 {
   if (ii->header.common->flags & GRN_OBJ_INDEX_LARGE) {
-    return (lseg << 17) + (loffset >> 3);
+    return
+      (lseg << GRN_II_POS_LSEG_SHIFT_SIZE_LARGE) +
+      (loffset >> GRN_II_POS_LOFFSET_SHIFT_SIZE_LARGE);
   } else {
-    return (lseg << 16) + (loffset >> 2);
+    return
+      (lseg << GRN_II_POS_LSEG_SHIFT_SIZE) +
+      (loffset >> GRN_II_POS_LOFFSET_SHIFT_SIZE);
   }
 }
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20190405/8d1ad77d/attachment-0001.html>


More information about the Groonga-commit mailing list
Back to archive index