monotone-commits-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Monotone-commits-diffs] net.venge.monotone.regex-cache: dbb5af793bce296


From: code
Subject: [Monotone-commits-diffs] net.venge.monotone.regex-cache: dbb5af793bce29645edde73368225c5259a06ecc
Date: Mon, 31 Oct 2011 10:37:51 +0100 (CET)

revision:            dbb5af793bce29645edde73368225c5259a06ecc
date:                2011-10-31T09:23:07
author:              Richard Hopkins <address@hidden>
branch:              net.venge.monotone.regex-cache
changelog:
Create 'regex_cache_manager' to manage the regex cache and correctly free
the compiled data

manifest:
format_version "1"

new_manifest [f801a732366d4c54137f4e6f359945dcd81d4120]

old_revision [3f8f0d347ad197aafa02785464810636e5db07eb]

patch "src/pcrewrap.cc"
 from [b50d03e955358a7d96e2babbe24ee59fb490649f]
   to [d9e2ecba7b4ce81fb9358343a510070253307424]
============================================================
--- src/pcrewrap.cc	b50d03e955358a7d96e2babbe24ee59fb490649f
+++ src/pcrewrap.cc	d9e2ecba7b4ce81fb9358343a510070253307424
@@ -76,8 +76,46 @@ namespace pcre
   typedef map<char const *,
               pair<struct real_pcre const *, struct pcre_extra const *> >
               regex_cache;
-  regex_cache compiled;
 
+  class regex_cache_manager
+  {
+public:
+    regex_cache::iterator find(char const * pattern)
+      {
+        return cache.find(pattern);
+      }
+
+    void store(char const * pattern,
+               pair<struct real_pcre const *, struct pcre_extra const *>
+               data)
+      {
+        cache[pattern] = data;
+      }
+
+    regex_cache::iterator end()
+      {
+        return cache.end();
+      }
+
+    ~regex_cache_manager()
+      {
+        for (regex_cache::iterator iter = cache.begin();
+             iter != cache.end();
+             ++iter)
+          {
+            if (iter->second.first)
+              pcre_free(const_cast<pcre_t *>(iter->second.first));
+
+            if (iter->second.second)
+              pcre_free(const_cast<pcre_extra *>(iter->second.second));
+          }
+      }
+private:
+    regex_cache cache;
+  };
+
+  regex_cache_manager compiled;
+
   void regex::init(char const * pattern, flags options)
   {
     int errcode;
@@ -116,7 +154,7 @@ namespace pcre
     ed->match_limit_recursion = 2000;
     extradat = ed;
     // store in cache
-    compiled[pattern] = make_pair(basedat, extradat);
+    compiled.store(pattern, make_pair(basedat, extradat));
   }
 
   regex::regex(char const * pattern, origin::type whence, flags options)
@@ -135,22 +173,6 @@ namespace pcre
   {
   }
 
-  // currently not called from anywhere so the entries are leaked
-  void free_compiled()
-  {
-    for (regex_cache::iterator iter = compiled.begin();
-         iter != compiled.end();
-         ++iter)
-      {
-        if (iter->second.first)
-          pcre_free(const_cast<pcre_t *>(iter->second.first));
-
-        if (iter->second.second)
-          pcre_free(const_cast<pcre_extra *>(iter->second.second));
-      }
-      compiled.clear();
-  }
-
   bool
   regex::match(string const & subject, origin::type subject_origin,
                flags options) const

reply via email to

[Prev in Thread] Current Thread [Next in Thread]