summaryrefslogtreecommitdiffabout
path: root/lib/sitespace.cc
Side-by-side diff
Diffstat (limited to 'lib/sitespace.cc') (more/less context) (show whitespace changes)
-rw-r--r--lib/sitespace.cc52
1 files changed, 52 insertions, 0 deletions
diff --git a/lib/sitespace.cc b/lib/sitespace.cc
new file mode 100644
index 0000000..0406d11
--- a/dev/null
+++ b/lib/sitespace.cc
@@ -0,0 +1,52 @@
+#ifdef USE_PCH
+ #include "pch.h"
+#else
+ #include <cassert>
+ #include "sitecing/sitespace.h"
+ #include "sitecing/sitecing_util.h"
+#endif
+
+namespace sitecing {
+
+ sitespace::sitespace(configuration& c)
+ : config(c), factory(c) { }
+
+ sitespace::~sitespace() {
+ for(sentenced_t::iterator i = sentenced.begin();i!=sentenced.end();++i) {
+ assert((*i)->chickens_used.empty());
+ delete *i;
+ }
+ }
+
+ so_component sitespace::fetch(const string& c,sitecing_interface* scif) {
+ execute_sentenced();
+ string sobase = normalize_path(c);
+ string sopath = factory.root_so+sobase+".so";
+ config_options *co_build = config.lookup_config(sobase,config_options::flag_build);
+ if( (!co_build) || co_build->build )
+ factory.make(sopath);
+ components_t::iterator i = components.find(sopath);
+ if(i!=components.end()) {
+ if(i->second->is_uptodate())
+ return so_component(i->second,scif);
+ if(i->second->chickens_used.empty()) {
+ delete i->second;
+ }else{
+ sentenced.push_back(i->second);
+ }
+ components.erase(i);
+ }
+ pair<components_t::iterator,bool> ins = components.insert(components_t::value_type(sopath,new component_so(sopath)));
+ return so_component(ins.first->second,scif);
+ }
+
+ void sitespace::execute_sentenced() {
+ for(sentenced_t::iterator i = sentenced.begin();i!=sentenced.end();++i) {
+ if((*i)->chickens_used.empty()) {
+ delete *i;
+ sentenced.erase(i);
+ }
+ }
+ }
+
+}