summaryrefslogtreecommitdiff
path: root/project2/ice/iceDataSource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'project2/ice/iceDataSource.cpp')
-rw-r--r--project2/ice/iceDataSource.cpp59
1 files changed, 47 insertions, 12 deletions
diff --git a/project2/ice/iceDataSource.cpp b/project2/ice/iceDataSource.cpp
index 7b77b19..064a69f 100644
--- a/project2/ice/iceDataSource.cpp
+++ b/project2/ice/iceDataSource.cpp
@@ -27,23 +27,51 @@ void
IceDataSource::SetSlice(const VariableType & vslice)
{
auto slice = vslice.as<std::string>();
- BuildComms bc(slice);
- BuildShared bcs(slice, { &bc });
- BuildClient bcl(slice, { &bcs });
- bcl.Update();
- libs.insert({ slice, bcl.Open() });
+ IceCompile::CPtr bc(new BuildComms(slice));
+ bc->Update(IceCompile::UpdateBuild);
+ IceCompile::CPtr bcs(new BuildShared(slice, { bc }));
+ IceCompile::CPtr bcl(new BuildClient(slice, { bcs }));
+ libs.push_back(LibCompile(bcl, new std::thread(&IceCompile::Update, bcl.get(),
+ IceCompile::UpdateBuild | IceCompile::UpdateCompile | IceCompile::UpdateLink)));
}
void
IceDataSource::SetSliceClient(const VariableType & vslice)
{
auto slice = vslice.as<std::string>();
- BuildComms bc(slice);
- bc.Update(IceCompile::UpdateBuild);
- BuildShared bcs(slice, { });
- BuildClient bcl(slice, { &bcs });
- bcl.Update();
- libs.insert({ slice, bcl.Open() });
+ IceCompile::CPtr bc(new BuildComms(slice));
+ bc->Update(IceCompile::UpdateBuild);
+ IceCompile::CPtr bcs(new BuildShared(slice, { }));
+ IceCompile::CPtr bcl(new BuildClient(slice, { bcs }));
+ libs.push_back(LibCompile(bcl, new std::thread(&IceCompile::Update, bcl.get(),
+ IceCompile::UpdateBuild | IceCompile::UpdateCompile | IceCompile::UpdateLink)));
+}
+
+class WaitAndLoad : public boost::static_visitor<> {
+ public:
+ WaitAndLoad(IceDataSource::LibPromise & l) : lib(l) { }
+
+ void operator()(IceDataSource::LibCompile & th) const
+ {
+ boost::get<1>(th)->join();
+ delete boost::get<1>(th);
+ lib = boost::get<0>(th)->Open();
+ }
+
+ void operator()(IceCompile::LibHandle) const
+ {
+ }
+
+ private:
+ IceDataSource::LibPromise & lib;
+};
+
+void
+IceDataSource::FinaliseLoad()
+{
+ BOOST_FOREACH(auto & lib, libs) {
+ boost::apply_visitor(WaitAndLoad(lib), lib);
+ }
}
void
@@ -53,5 +81,12 @@ IceDataSource::ClearSlice()
proxies.clear();
}
-DECLARE_LOADER("icedatasource", IceDataSource);
+class IceDataSourceLoader : public ElementLoader::For<IceDataSource> {
+ public:
+ void onConfigLoad() override {
+ IceDataSource::FinaliseLoad();
+ }
+};
+
+DECLARE_CUSTOM_LOADER("icedatasource", IceDataSourceLoader);