[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Monotone-commits-diffs] net.venge.monotone.regex-cache: dbb5af793bce29645edde73368225c5259a06ecc,
code <=