diff options
Diffstat (limited to 'project2/ice/iceDataSource.cpp')
-rw-r--r-- | project2/ice/iceDataSource.cpp | 59 |
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); |