diff options
author | Marius Kintel <marius@kintel.net> | 2012-02-17 22:05:36 (GMT) |
---|---|---|
committer | Marius Kintel <marius@kintel.net> | 2012-02-17 22:05:36 (GMT) |
commit | 2316127e62ba4c4c0e49cd35d869fcaeca357a29 (patch) | |
tree | d4876248cb049d58583d97bb1b716db6815904b2 /src/ModuleCache.cc | |
parent | 6845399e497726958d51170f906474e2624848c4 (diff) |
Handle include dependencies
Diffstat (limited to 'src/ModuleCache.cc')
-rw-r--r-- | src/ModuleCache.cc | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/src/ModuleCache.cc b/src/ModuleCache.cc index 7a0fe51..e974a03 100644 --- a/src/ModuleCache.cc +++ b/src/ModuleCache.cc @@ -6,10 +6,12 @@ #include "boosty.h" #include <boost/format.hpp> #include <boost/filesystem.hpp> +#include <boost/foreach.hpp> #include <stdio.h> #include <fstream> #include <sstream> +#include <time.h> #include <sys/stat.h> /*! @@ -18,10 +20,18 @@ ModuleCache *ModuleCache::inst = NULL; +static bool is_modified(const std::string &filename, const time_t &mtime) +{ + struct stat st; + memset(&st, 0, sizeof(struct stat)); + stat(filename.c_str(), &st); + return (st.st_mtime > mtime); +} + Module *ModuleCache::evaluate(const std::string &filename) { Module *lib_mod = NULL; - + // Create cache ID struct stat st; memset(&st, 0, sizeof(struct stat)); @@ -35,8 +45,14 @@ Module *ModuleCache::evaluate(const std::string &filename) #ifdef DEBUG PRINTB("Using cached library: %s (%s)", filename % cache_id); #endif - PRINTB("%s", this->entries[filename].msg); lib_mod = &(*this->entries[filename].module); + + BOOST_FOREACH(const Module::IncludeContainer::value_type &item, lib_mod->includes) { + if (is_modified(item.first, item.second)) { + lib_mod = NULL; + break; + } + } } // If cache lookup failed (non-existing or old timestamp), compile module @@ -59,9 +75,10 @@ Module *ModuleCache::evaluate(const std::string &filename) print_messages_push(); - cache_entry e = { NULL, cache_id, std::string("WARNING: Library `") + filename + "' tries to recursively use itself!" }; - if (this->entries.find(filename) != this->entries.end()) + cache_entry e = { NULL, cache_id }; + if (this->entries.find(filename) != this->entries.end()) { delete this->entries[filename].module; + } this->entries[filename] = e; std::string pathname = boosty::stringy(fs::path(filename).parent_path()); @@ -69,7 +86,6 @@ Module *ModuleCache::evaluate(const std::string &filename) if (lib_mod) { this->entries[filename].module = lib_mod; - this->entries[filename].msg = print_messages_stack.back(); } else { this->entries.erase(filename); } |