diff options
author | Marius Kintel <marius@kintel.net> | 2013-06-13 05:16:26 (GMT) |
---|---|---|
committer | Marius Kintel <marius@kintel.net> | 2013-06-13 05:16:26 (GMT) |
commit | bd0248e109f6a290570bca55949583ea80bdce38 (patch) | |
tree | 67a4409890ef44544b08af915a428cf18a283de7 /src/ModuleCache.cc | |
parent | 0cb8ab508ec1b3a072a2d5ef63fe1d46f16310f0 (diff) |
Fixed a bug where changing a file during a large automatic reload could cause a crash
Diffstat (limited to 'src/ModuleCache.cc')
-rw-r--r-- | src/ModuleCache.cc | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/ModuleCache.cc b/src/ModuleCache.cc index 83f7b7d..99c0b20 100644 --- a/src/ModuleCache.cc +++ b/src/ModuleCache.cc @@ -30,8 +30,14 @@ ModuleCache *ModuleCache::inst = NULL; */ FileModule *ModuleCache::evaluate(const std::string &filename) { + FileModule *lib_mod = (this->entries.find(filename) != this->entries.end()) ? + &(*this->entries[filename].module) : NULL; + + // Don't try to recursively evaluate - if the file changes + // during evaluation, that would be really bad. + if (lib_mod && lib_mod->isHandlingDependencies()) return lib_mod; + bool shouldCompile = true; - FileModule *lib_mod = NULL; // Create cache ID struct stat st; @@ -44,8 +50,7 @@ FileModule *ModuleCache::evaluate(const std::string &filename) std::string cache_id = str(boost::format("%x.%x") % st.st_mtime % st.st_size); // Lookup in cache - if (this->entries.find(filename) != this->entries.end()) { - lib_mod = &(*this->entries[filename].module); + if (lib_mod) { if (this->entries[filename].cache_id == cache_id) { shouldCompile = false; @@ -104,7 +109,9 @@ FileModule *ModuleCache::evaluate(const std::string &filename) print_messages_pop(); } - if (lib_mod) lib_mod->handleDependencies(); + if (lib_mod) { + lib_mod->handleDependencies(); + } return lib_mod; } @@ -114,3 +121,9 @@ void ModuleCache::clear() this->entries.clear(); } +FileModule *ModuleCache::lookup(const std::string &filename) +{ + return (this->entries.find(filename) != this->entries.end()) ? + &(*this->entries[filename].module) : NULL; +} + |