[Groonga-commit] groonga/groonga at 273aef5 [master] grn_ja_reader: use inflate() and inflateReset() instead of uncompress()

Back to archive index

Susumu Yata null+****@clear*****
Mon Dec 7 16:40:33 JST 2015


Susumu Yata	2015-12-07 16:40:33 +0900 (Mon, 07 Dec 2015)

  New Revision: 273aef52406294dc3d869143d9528a18526127ea
  https://github.com/groonga/groonga/commit/273aef52406294dc3d869143d9528a18526127ea

  Message:
    grn_ja_reader: use inflate() and inflateReset() instead of uncompress()
    
    This change reduces initialization and finalization of z_stream (zlib).
    
    GitHub: #441

  Modified files:
    lib/grn_store.h
    lib/store.c

  Modified: lib/grn_store.h (+3 -2)
===================================================================
--- lib/grn_store.h    2015-12-07 16:58:27 +0900 (c5da1b1)
+++ lib/grn_store.h    2015-12-07 16:40:33 +0900 (2113be2)
@@ -117,16 +117,17 @@ typedef struct {
   uint32_t packed_size;
   void *packed_buf;
   uint32_t packed_buf_size;
+  void *stream;
 } grn_ja_reader;
 
 /*
  * grn_ja_reader_init() initializes a reader.
  * An initialized reader must be finalized by grn_ja_reader_fin().
  */
-void grn_ja_reader_init(grn_ctx *ctx, grn_ja_reader *reader, grn_ja *ja);
+grn_rc grn_ja_reader_init(grn_ctx *ctx, grn_ja_reader *reader, grn_ja *ja);
 
 /* grn_ja_reader_fin() finalizes a reader. */
-void grn_ja_reader_fin(grn_ctx *ctx, grn_ja_reader *reader);
+grn_rc grn_ja_reader_fin(grn_ctx *ctx, grn_ja_reader *reader);
 
 /*
  * grn_ja_reader_open() creates a reader.

  Modified: lib/store.c (+52 -11)
===================================================================
--- lib/store.c    2015-12-07 16:58:27 +0900 (7e8a0d3)
+++ lib/store.c    2015-12-07 16:40:33 +0900 (a147f7f)
@@ -1576,7 +1576,7 @@ grn_ja_check(grn_ctx *ctx, grn_ja *ja)
 
 /* grn_ja_reader */
 
-void
+grn_rc
 grn_ja_reader_init(grn_ctx *ctx, grn_ja_reader *reader, grn_ja *ja)
 {
   reader->ja = ja;
@@ -1585,11 +1585,29 @@ grn_ja_reader_init(grn_ctx *ctx, grn_ja_reader *reader, grn_ja *ja)
   reader->body_seg_addr = NULL;
   reader->packed_buf = NULL;
   reader->packed_buf_size = 0;
+#ifdef GRN_WITH_ZLIB
+  if (reader->ja->header->flags & GRN_OBJ_COMPRESS_ZLIB) {
+    z_stream *new_stream = GRN_MALLOCN(z_stream, 1);
+    if (!new_stream) {
+      return GRN_NO_MEMORY_AVAILABLE;
+    }
+    new_stream->zalloc = NULL;
+    new_stream->zfree = NULL;
+    new_stream->opaque = NULL;
+    if (inflateInit2(new_stream, 15) != Z_OK) {
+      GRN_FREE(new_stream);
+      return GRN_NO_MEMORY_AVAILABLE;
+    }
+    reader->stream = new_stream;
+  }
+#endif /* GRN_WITH_ZLIB */
+  return GRN_SUCCESS;
 }
 
-void
+grn_rc
 grn_ja_reader_fin(grn_ctx *ctx, grn_ja_reader *reader)
 {
+  grn_rc rc = GRN_SUCCESS;
   if (reader->einfo_seg_id != JA_ESEG_VOID) {
     GRN_IO_SEG_UNREF(reader->ja->io, reader->einfo_seg_id);
   }
@@ -1599,16 +1617,32 @@ grn_ja_reader_fin(grn_ctx *ctx, grn_ja_reader *reader)
   if (reader->packed_buf) {
     GRN_FREE(reader->packed_buf);
   }
+#ifdef GRN_WITH_ZLIB
+  if (reader->ja->header->flags & GRN_OBJ_COMPRESS_ZLIB) {
+    if (reader->stream) {
+      if (inflateEnd((z_stream *)reader->stream) != Z_OK) {
+        rc = GRN_UNKNOWN_ERROR;
+      }
+      GRN_FREE(reader->stream);
+    }
+  }
+#endif /* GRN_WITH_ZLIB */
+  return rc;
 }
 
 grn_rc
 grn_ja_reader_open(grn_ctx *ctx, grn_ja *ja, grn_ja_reader **reader)
 {
+  grn_rc rc;
   grn_ja_reader *new_reader = GRN_MALLOCN(grn_ja_reader, 1);
   if (!new_reader) {
     return GRN_NO_MEMORY_AVAILABLE;
   }
-  grn_ja_reader_init(ctx, new_reader, ja);
+  rc = grn_ja_reader_init(ctx, new_reader, ja);
+  if (rc != GRN_SUCCESS) {
+    GRN_FREE(new_reader);
+    return rc;
+  }
   *reader = new_reader;
   return GRN_SUCCESS;
 }
@@ -1616,9 +1650,9 @@ grn_ja_reader_open(grn_ctx *ctx, grn_ja *ja, grn_ja_reader **reader)
 grn_rc
 grn_ja_reader_close(grn_ctx *ctx, grn_ja_reader *reader)
 {
-  grn_ja_reader_fin(ctx, reader);
+  grn_rc rc = grn_ja_reader_fin(ctx, reader);
   GRN_FREE(reader);
-  return GRN_SUCCESS;
+  return rc;
 }
 
 #if defined(GRN_WITH_ZLIB) || defined(GRN_WITH_LZ4)
@@ -1732,6 +1766,7 @@ static grn_rc
 grn_ja_reader_read_zlib(grn_ctx *ctx, grn_ja_reader *reader, void *buf)
 {
   uLong dest_size = reader->value_size;
+  z_stream *stream = (z_stream *)reader->stream;
   grn_ja_einfo *einfo = (grn_ja_einfo *)reader->einfo;
   if (EHUGE_P(einfo)) {
     /* TODO: Use z_stream to avoid copy. */
@@ -1771,20 +1806,26 @@ grn_ja_reader_read_zlib(grn_ctx *ctx, grn_ja_reader *reader, void *buf)
     grn_memcpy(packed_ptr, seg_addr, size);
     GRN_IO_SEG_UNREF(io, seg_id);
     seg_id++;
-    if (uncompress((Bytef *)buf, &dest_size, (const Bytef *)reader->packed_buf,
+    if (uncompress((Bytef *)buf, &dest_size, (Bytef *)reader->packed_buf,
                    reader->packed_size - sizeof(uint64_t)) != Z_OK) {
       return GRN_UNKNOWN_ERROR;
     }
+    if (dest_size != reader->value_size) {
+      return GRN_UNKNOWN_ERROR;
+    }
   } else {
     char *packed_addr = (char *)reader->body_seg_addr;
     packed_addr += reader->body_seg_offset + sizeof(uint64_t);
-    if (uncompress((Bytef *)buf, &dest_size, (const Bytef *)packed_addr,
-                   reader->packed_size - sizeof(uint64_t)) != Z_OK) {
+    if (inflateReset(stream) != Z_OK) {
+      return GRN_UNKNOWN_ERROR;
+    }
+    stream->next_in = (Bytef *)packed_addr;
+    stream->avail_in = reader->packed_size - sizeof(uint64_t);
+    stream->next_out = (Bytef *)buf;
+    stream->avail_out = dest_size;
+    if ((inflate(stream, Z_FINISH) != Z_STREAM_END) || stream->avail_out) {
       return GRN_UNKNOWN_ERROR;
     }
-  }
-  if (dest_size != reader->value_size) {
-    return GRN_UNKNOWN_ERROR;
   }
   return GRN_SUCCESS;
 }
-------------- next part --------------
HTML����������������������������...
Download 



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