From 023a158af109b2a171f6d4f3dcfae4090fba4b1b Mon Sep 17 00:00:00 2001 From: Ciaran McCreesh Date: Tue, 8 Feb 2011 19:03:55 +0000 Subject: Thread cave generate-metadata --- src/clients/cave/cmd_generate_metadata.cc | 66 ++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/src/clients/cave/cmd_generate_metadata.cc b/src/clients/cave/cmd_generate_metadata.cc index 29be83c6f..95bc9de2d 100644 --- a/src/clients/cave/cmd_generate_metadata.cc +++ b/src/clients/cave/cmd_generate_metadata.cc @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include #include #include @@ -40,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -97,6 +100,40 @@ namespace auto PALUDIS_ATTRIBUTE((unused)) v(k.value()); } }; + + void worker(Mutex & mutex, PackageIDSequence::ConstIterator & i, const PackageIDSequence::ConstIterator & i_end, bool & fail) + { + while (true) + { + std::shared_ptr id; + { + Lock lock(mutex); + if (i != i_end) + id = *i++; + } + + if (! id) + return; + + for (PackageID::MetadataConstIterator m(id->begin_metadata()), m_end(id->end_metadata()); m_end != m; ++m) + try + { + MetadataVisitor v; + (*m)->accept(v); + } + catch (const InternalError &) + { + throw; + } + catch (const Exception & e) + { + Lock lock(mutex); + std::cerr << "When processing '" << **i << "' got exception '" << e.message() << "' (" << e.what() << ")" << std::endl; + fail = true; + break; + } + } + } } int @@ -131,25 +168,18 @@ GenerateMetadataCommand::run( const std::shared_ptr ids((*env)[selection::AllVersionsSorted(g)]); bool fail(false); - MetadataVisitor v; - for (PackageIDSequence::ConstIterator i(ids->begin()), i_end(ids->end()) ; - i != i_end ; ++i) + Mutex mutex; + + PackageIDSequence::ConstIterator i(ids->begin()), i_end(ids->end()); { - for (PackageID::MetadataConstIterator m((*i)->begin_metadata()), m_end((*i)->end_metadata()); m_end != m; ++m) - try - { - (*m)->accept(v); - } - catch (const InternalError &) - { - throw; - } - catch (const Exception & e) - { - std::cerr << "When processing '" << **i << "' got exception '" << e.message() << "' (" << e.what() << ")" << std::endl; - fail = true; - break; - } + ThreadPool pool; + + int n_procs(get_nprocs()); + if (n_procs < 1) + n_procs = 1; + + for (int n(0), n_end(n_procs) ; n != n_end ; ++n) + pool.create_thread(std::bind(&worker, std::ref(mutex), std::ref(i), std::cref(i_end), std::ref(fail))); } return fail ? EXIT_FAILURE : EXIT_SUCCESS; -- cgit v1.2.3