[Groonga-commit] groonga/groonga at c0d7221 [master] io: use the given ctx for logging in mmap/munmap

Back to archive index

Susumu Yata null+****@clear*****
Thu Mar 31 14:36:49 JST 2016


Susumu Yata	2016-03-31 14:36:49 +0900 (Thu, 31 Mar 2016)

  New Revision: c0d722178dd007c95dbff3bd006d8b1b743793a5
  https://github.com/groonga/groonga/commit/c0d722178dd007c95dbff3bd006d8b1b743793a5

  Message:
    io: use the given ctx for logging in mmap/munmap
    
    This commit adds a new argument (named owner_ctx) to functions for mmap.
    It is added for resource management, but it is actually not used yet.
    
    GitHub: #513

  Modified files:
    lib/io.c

  Modified: lib/io.c (+61 -52)
===================================================================
--- lib/io.c    2016-03-31 13:49:21 +0900 (4282677)
+++ lib/io.c    2016-03-31 14:36:49 +0900 (05953e7)
@@ -70,33 +70,36 @@ inline static void grn_fileinfo_init(fileinfo *fis, int nfis);
 inline static int grn_fileinfo_opened(fileinfo *fi);
 inline static grn_rc grn_fileinfo_close(grn_ctx *ctx, fileinfo *fi);
 #ifdef WIN32
-inline static void * grn_mmap(grn_ctx *ctx, grn_io *io,
-                              HANDLE *fmo, fileinfo *fi,
+inline static void * grn_mmap(grn_ctx *ctx, grn_ctx *owner_ctx,
+                              grn_io *io, HANDLE *fmo, fileinfo *fi,
                               off_t offset, size_t length);
-inline static int grn_munmap(grn_ctx *ctx, grn_io *io,
-                             HANDLE *fmo, fileinfo *fi,
+inline static int grn_munmap(grn_ctx *ctx, grn_ctx *owner_ctx,
+                             grn_io *io, HANDLE *fmo, fileinfo *fi,
                              void *start, size_t length);
-# define GRN_MMAP(ctx,io,fmo,fi,offset,length)\
-  (grn_mmap((ctx), (io), (fmo), (fi), (offset), (length)))
-# define GRN_MUNMAP(ctx,io,fmo,fi,start,length)\
-  (grn_munmap((ctx), (io), (fmo), (fi), (start), (length)))
+# define GRN_MMAP(ctx,owner_ctx,io,fmo,fi,offset,length)\
+  (grn_mmap((ctx), (owner_ctx), (io), (fmo), (fi), (offset), (length)))
+# define GRN_MUNMAP(ctx,owner_ctx,io,fmo,fi,start,length)\
+  (grn_munmap((ctx), (owner_ctx), (io), (fmo), (fi), (start), (length)))
 #else /* WIN32 */
-inline static void * grn_mmap(grn_ctx *ctx, grn_io *io, fileinfo *fi,
+inline static void * grn_mmap(grn_ctx *ctx, grn_ctx *owner_ctx,
+                              grn_io *io, fileinfo *fi,
                               off_t offset, size_t length);
-inline static int grn_munmap(grn_ctx *ctx, grn_io *io, fileinfo *fi,
+inline static int grn_munmap(grn_ctx *ctx, grn_ctx *owner_ctx,
+                             grn_io *io, fileinfo *fi,
                              void *start, size_t length);
-# define GRN_MUNMAP(ctx,io,fmo,fi,start,length) \
-  (grn_munmap((ctx), (io), (fi), (start), (length)))
+# define GRN_MUNMAP(ctx,owner_ctx,io,fmo,fi,start,length) \
+  (grn_munmap((ctx), (owner_ctx), (io), (fi), (start), (length)))
 # ifdef USE_FAIL_MALLOC
-inline static void * grn_fail_mmap(grn_ctx *ctx, grn_io *io, fileinfo *fi,
+inline static void * grn_fail_mmap(grn_ctx *ctx, grn_ctx *owner_ctx,
+                                   grn_io *io, fileinfo *fi,
                                    off_t offset, size_t length,
                                    const char* file, int line, const char *func);
-#  define GRN_MMAP(ctx,io,fmo,fi,offset,length)\
-  (grn_fail_mmap((ctx), (io), (fi), (offset), (length),\
+#  define GRN_MMAP(ctx,owner_ctx,io,fmo,fi,offset,length)\
+  (grn_fail_mmap((ctx), (owner_ctx), (io), (fi), (offset), (length),\
                  __FILE__, __LINE__, __FUNCTION__))
 # else /* USE_FAIL_MALLOC */
-#  define GRN_MMAP(ctx,io,fmo,fi,offset,length)\
-  (grn_mmap((ctx), (io), (fi), (offset), (length)))
+#  define GRN_MMAP(ctx,owner_ctx,io,fmo,fi,offset,length)\
+  (grn_mmap((ctx), (owner_ctx), (io), (fi), (offset), (length)))
 # endif /* USE_FAIL_MALLOC */
 #endif  /* WIN32 */
 inline static int grn_msync(grn_ctx *ctx, void *start, size_t length);
@@ -186,8 +189,8 @@ grn_io_max_n_files(grn_io *io)
                                     file_size);
 }
 
-grn_io *
-grn_io_create_tmp(uint32_t header_size, uint32_t segment_size,
+static grn_io *
+grn_io_create_tmp(grn_ctx *ctx, uint32_t header_size, uint32_t segment_size,
                   uint32_t max_segment, grn_io_mode mode, uint32_t flags)
 {
   grn_io *io;
@@ -195,7 +198,8 @@ grn_io_create_tmp(uint32_t header_size, uint32_t segment_size,
   struct _grn_io_header *header;
   b = grn_io_compute_base(header_size);
   CRITICAL_SECTION_ENTER(grn_glock);
-  header = (struct _grn_io_header *)GRN_MMAP(&grn_gctx, NULL, NULL, NULL, 0, b);
+  header = (struct _grn_io_header *)GRN_MMAP(ctx, &grn_gctx, NULL, NULL, NULL,
+                                             0, b);
   if (header) {
     header->version = grn_io_version_default;
     header->header_size = header_size;
@@ -228,7 +232,7 @@ grn_io_create_tmp(uint32_t header_size, uint32_t segment_size,
       }
       GRN_GFREE(io);
     }
-    GRN_MUNMAP(&grn_gctx, NULL, NULL, NULL, header, b);
+    GRN_MUNMAP(ctx, &grn_gctx, NULL, NULL, NULL, header, b);
   }
   CRITICAL_SECTION_LEAVE(grn_glock);
   return NULL;
@@ -271,8 +275,9 @@ grn_io_unregister(grn_io *io)
 }
 
 grn_io *
-grn_io_create(grn_ctx *ctx, const char *path, uint32_t header_size, uint32_t segment_size,
-              uint32_t max_segment, grn_io_mode mode, uint32_t flags)
+grn_io_create(grn_ctx *ctx, const char *path, uint32_t header_size,
+              uint32_t segment_size, uint32_t max_segment, grn_io_mode mode,
+              uint32_t flags)
 {
   grn_io *io;
   fileinfo *fis;
@@ -283,7 +288,8 @@ grn_io_create(grn_ctx *ctx, const char *path, uint32_t header_size, uint32_t seg
   unsigned long file_size;
 
   if (!path) {
-    return grn_io_create_tmp(header_size, segment_size, max_segment, mode, flags);
+    return grn_io_create_tmp(ctx, header_size, segment_size, max_segment,
+                             mode, flags);
   }
   if (!*path || (strlen(path) > PATH_MAX - 4)) { return NULL; }
   b = grn_io_compute_base(header_size);
@@ -295,7 +301,7 @@ grn_io_create(grn_ctx *ctx, const char *path, uint32_t header_size, uint32_t seg
   if ((fis = GRN_GMALLOCN(fileinfo, max_nfiles))) {
     grn_fileinfo_init(fis, max_nfiles);
     if (!grn_fileinfo_open(ctx, fis, path, O_RDWR|O_CREAT|O_EXCL)) {
-      header = (struct _grn_io_header *)GRN_MMAP(&grn_gctx, NULL,
+      header = (struct _grn_io_header *)GRN_MMAP(ctx, &grn_gctx, NULL,
                                                  &fis->fmo, fis, 0, b);
       if (header) {
         header->version = version;
@@ -331,7 +337,7 @@ grn_io_create(grn_ctx *ctx, const char *path, uint32_t header_size, uint32_t seg
           }
           GRN_GFREE(io);
         }
-        GRN_MUNMAP(&grn_gctx, NULL, &fis->fmo, fis, header, b);
+        GRN_MUNMAP(ctx, &grn_gctx, NULL, &fis->fmo, fis, header, b);
       }
       grn_fileinfo_close(ctx, fis);
       if (grn_unlink(path) == -1) {
@@ -620,7 +626,7 @@ grn_io_open(grn_ctx *ctx, const char *path, grn_io_mode mode)
   if (!grn_fileinfo_open(ctx, &fi, path, O_RDWR)) {
     struct _grn_io_header *header;
     CRITICAL_SECTION_ENTER(grn_glock);
-    header = GRN_MMAP(&grn_gctx, NULL, &(fi.fmo), &fi, 0, b);
+    header = GRN_MMAP(ctx, &grn_gctx, NULL, &(fi.fmo), &fi, 0, b);
     if (header) {
       unsigned long file_size;
       unsigned int max_nfiles;
@@ -631,7 +637,7 @@ grn_io_open(grn_ctx *ctx, const char *path, grn_io_mode mode)
                                               bs, file_size);
       fis = GRN_GMALLOCN(fileinfo, max_nfiles);
       if (!fis) {
-        GRN_MUNMAP(&grn_gctx, NULL, &(fi.fmo), &fi, header, b);
+        GRN_MUNMAP(ctx, &grn_gctx, NULL, &(fi.fmo), &fi, header, b);
         CRITICAL_SECTION_LEAVE(grn_glock);
         grn_fileinfo_close(ctx, &fi);
         return NULL;
@@ -667,7 +673,7 @@ grn_io_open(grn_ctx *ctx, const char *path, grn_io_mode mode)
         GRN_GFREE(io);
       }
       GRN_GFREE(fis);
-      GRN_MUNMAP(&grn_gctx, NULL, &(fi.fmo), &fi, header, b);
+      GRN_MUNMAP(ctx, &grn_gctx, NULL, &(fi.fmo), &fi, header, b);
     }
     CRITICAL_SECTION_LEAVE(grn_glock);
     grn_fileinfo_close(ctx, &fi);
@@ -706,12 +712,12 @@ grn_io_close(grn_ctx *ctx, grn_io *io)
           uint32_t fno = bseg / segments_per_file;
           fi = &io->fis[fno];
         }
-        GRN_MUNMAP(&grn_gctx, io, &mi->fmo, fi, mi->map, segment_size);
+        GRN_MUNMAP(ctx, &grn_gctx, io, &mi->fmo, fi, mi->map, segment_size);
       }
     }
     GRN_GFREE(io->maps);
   }
-  GRN_MUNMAP(&grn_gctx, io, (io->fis ? &io->fis->fmo : NULL),
+  GRN_MUNMAP(ctx, &grn_gctx, io, (io->fis ? &io->fis->fmo : NULL),
              io->fis, io->header, io->base);
   if (io->fis) {
     int i;
@@ -1157,9 +1163,7 @@ grn_io_win_unmap(grn_io_win *iw)
 }
 
 #define DO_MAP(io,fmo,fi,pos,size,segno,res) do {\
-  CRITICAL_SECTION_ENTER(grn_glock);\
-  (res) = GRN_MMAP(&grn_gctx, (io), (fmo), (fi), (pos), (size));\
-  CRITICAL_SECTION_LEAVE(grn_glock);\
+  (res) = GRN_MMAP(ctx, &grn_gctx, (io), (fmo), (fi), (pos), (size));\
   if ((res)) {\
     uint32_t nmaps;\
     if (io->max_map_seg < segno) { io->max_map_seg = segno; }\
@@ -1232,7 +1236,7 @@ grn_io_seg_expire(grn_ctx *ctx, grn_io *io, uint32_t segno, uint32_t nretry)
         uint32_t nmaps;
         fileinfo *fi = &(io->fis[segno]);
         CRITICAL_SECTION_ENTER(grn_glock);
-        GRN_MUNMAP(&grn_gctx, io, &info->fmo, fi,
+        GRN_MUNMAP(ctx, &grn_gctx, io, &info->fmo, fi,
                    info->map, io->header->segment_size);
         CRITICAL_SECTION_LEAVE(grn_glock);
         info->map = NULL;
@@ -1272,7 +1276,7 @@ grn_io_expire(grn_ctx *ctx, grn_io *io, int count_thresh, uint32_t limit)
             if (info->map) {
               fileinfo *fi = &(io->fis[fno]);
               CRITICAL_SECTION_ENTER(grn_glock);
-              GRN_MUNMAP(&grn_gctx, io, &info->fmo, fi,
+              GRN_MUNMAP(ctx, &grn_gctx, io, &info->fmo, fi,
                          info->map, io->header->segment_size);
               CRITICAL_SECTION_LEAVE(grn_glock);
               info->map = NULL;
@@ -1301,7 +1305,7 @@ grn_io_expire(grn_ctx *ctx, grn_io *io, int count_thresh, uint32_t limit)
           GRN_ATOMIC_ADD_EX(pnref, 1, nref);
           if (!nref && info->map && (grn_gtick - info->count) > count_thresh) {
             CRITICAL_SECTION_ENTER(grn_glock);
-            GRN_MUNMAP(&grn_gctx, io, &info->fmo, NULL,
+            GRN_MUNMAP(ctx, &grn_gctx, io, &info->fmo, NULL,
                        info->map, io->header->segment_size);
             CRITICAL_SECTION_LEAVE(grn_glock);
             GRN_ATOMIC_ADD_EX(&io->nmaps, -1, nmaps);
@@ -1325,13 +1329,13 @@ grn_io_expire(grn_ctx *ctx, grn_io *io, int count_thresh, uint32_t limit)
 void *
 grn_io_anon_map(grn_ctx *ctx, grn_io_mapinfo *mi, size_t length)
 {
-  return (mi->map = GRN_MMAP(ctx, NULL, &mi->fmo, NULL, 0, length));
+  return (mi->map = GRN_MMAP(ctx, ctx, NULL, &mi->fmo, NULL, 0, length));
 }
 
 void
 grn_io_anon_unmap(grn_ctx *ctx, grn_io_mapinfo *mi, size_t length)
 {
-  GRN_MUNMAP(ctx, NULL, &mi->fmo, NULL, mi->map, length);
+  GRN_MUNMAP(ctx, ctx, NULL, &mi->fmo, NULL, mi->map, length);
 }
 
 grn_rc
@@ -1452,7 +1456,8 @@ grn_fileinfo_open_v1(grn_ctx *ctx, fileinfo *fi, const char *path, int flags)
 }
 
 inline static void *
-grn_mmap_v1(grn_ctx *ctx, HANDLE *fmo, fileinfo *fi, off_t offset, size_t length)
+grn_mmap_v1(grn_ctx *ctx, grn_ctx *owner_ctx, HANDLE *fmo, fileinfo *fi,
+            off_t offset, size_t length)
 {
   void *res;
   if (!fi) {
@@ -1487,7 +1492,7 @@ grn_mmap_v1(grn_ctx *ctx, HANDLE *fmo, fileinfo *fi, off_t offset, size_t length
 }
 
 inline static int
-grn_munmap_v1(grn_ctx *ctx, HANDLE *fmo, fileinfo *fi,
+grn_munmap_v1(grn_ctx *ctx, grn_ctx *owner_ctx, HANDLE *fmo, fileinfo *fi,
               void *start, size_t length)
 {
   int r = 0;
@@ -1559,7 +1564,8 @@ grn_fileinfo_open_v0(grn_ctx *ctx, fileinfo *fi, const char *path, int flags)
 }
 
 inline static void *
-grn_mmap_v0(grn_ctx *ctx, fileinfo *fi, off_t offset, size_t length)
+grn_mmap_v0(grn_ctx *ctx, grn_ctx *owner_ctx, fileinfo *fi, off_t offset,
+            size_t length)
 {
   void *res;
   if (!fi) { return GRN_GCALLOC(length); }
@@ -1590,7 +1596,8 @@ grn_mmap_v0(grn_ctx *ctx, fileinfo *fi, off_t offset, size_t length)
 }
 
 inline static int
-grn_munmap_v0(grn_ctx *ctx, fileinfo *fi, void *start, size_t length)
+grn_munmap_v0(grn_ctx *ctx, grn_ctx *owner_ctx, fileinfo *fi, void *start,
+              size_t length)
 {
   if (!fi) {
     GRN_GFREE(start);
@@ -1732,7 +1739,7 @@ grn_guess_io_version(grn_ctx *ctx, grn_io *io, fileinfo *fi)
 }
 
 inline static void *
-grn_mmap(grn_ctx *ctx, grn_io *io, HANDLE *fmo,
+grn_mmap(grn_ctx *ctx, grn_ctx *owner_ctx, grn_io *io, HANDLE *fmo,
          fileinfo *fi, off_t offset, size_t length)
 {
   int version;
@@ -1740,14 +1747,14 @@ grn_mmap(grn_ctx *ctx, grn_io *io, HANDLE *fmo,
   version = grn_guess_io_version(ctx, io, fi);
 
   if (version == 0) {
-    return grn_mmap_v0(ctx, fi, offset, length);
+    return grn_mmap_v0(ctx, owner_ctx, fi, offset, length);
   } else {
-    return grn_mmap_v1(ctx, fmo, fi, offset, length);
+    return grn_mmap_v1(ctx, owner_ctx, fmo, fi, offset, length);
   }
 }
 
 inline static int
-grn_munmap(grn_ctx *ctx, grn_io *io,
+grn_munmap(grn_ctx *ctx, grn_ctx *owner_ctx, grn_io *io,
            HANDLE *fmo, fileinfo *fi, void *start, size_t length)
 {
   int version;
@@ -1755,9 +1762,9 @@ grn_munmap(grn_ctx *ctx, grn_io *io,
   version = grn_guess_io_version(ctx, io, fi);
 
   if (version == 0) {
-    return grn_munmap_v0(ctx, fi, start, length);
+    return grn_munmap_v0(ctx, owner_ctx, fi, start, length);
   } else {
-    return grn_munmap_v1(ctx, fmo, fi, start, length);
+    return grn_munmap_v1(ctx, owner_ctx, fmo, fi, start, length);
   }
 }
 
@@ -1904,7 +1911,8 @@ grn_fileinfo_close(grn_ctx *ctx, fileinfo *fi)
 #include <sys/mman.h>
 
 inline static void *
-grn_mmap(grn_ctx *ctx, grn_io *io, fileinfo *fi, off_t offset, size_t length)
+grn_mmap(grn_ctx *ctx, grn_ctx *owner_ctx, grn_io *io, fileinfo *fi,
+         off_t offset, size_t length)
 {
   void *res;
   int fd, flags;
@@ -1934,7 +1942,7 @@ grn_mmap(grn_ctx *ctx, grn_io *io, fileinfo *fi, off_t offset, size_t length)
 
 #ifdef USE_FAIL_MALLOC
 inline static void *
-grn_fail_mmap(grn_ctx *ctx, grn_io *io, fileinfo *fi,
+grn_fail_mmap(grn_ctx *ctx, grn_ctx *owner_ctx, grn_io *io, fileinfo *fi,
               off_t offset, size_t length,
               const char* file, int line, const char *func)
 {
@@ -1964,7 +1972,8 @@ grn_msync(grn_ctx *ctx, void *start, size_t length)
 }
 
 inline static int
-grn_munmap(grn_ctx *ctx, grn_io *io, fileinfo *fi, void *start, size_t length)
+grn_munmap(grn_ctx *ctx, grn_ctx *owner_ctx, grn_io *io, fileinfo *fi,
+           void *start, size_t length)
 {
   int res;
   res = munmap(start, length);
-------------- next part --------------
HTML����������������������������...
Download 



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