- Timestamp:
- Jun 27, 2012, 4:07:21 PM (13 years ago)
- Branches:
- Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
- Children:
- 8d7917
- Parents:
- 8036b7
- git-author:
- Frederik Heber <heber@…> (02/22/12 18:33:19)
- git-committer:
- Frederik Heber <heber@…> (06/27/12 16:07:21)
- Location:
- src/Fragmentation/Automation
- Files:
-
- 2 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Fragmentation/Automation/FragmentWorker.cpp
r8036b7 r95454a 39 39 #include "FragmentWorker.hpp" 40 40 41 FragmentResult::ptr FragmentWorker::EmptyResult( new FragmentResult(JobId::NoJob, std::string("EmptyResult")) );42 43 41 /** Helper function to enforce binding of FragmentWorker to possible derived 44 42 * FragmentJob classes. … … 55 53 const std::string& service) : 56 54 connection_(io_service), 57 result(JobId::IllegalJob), 58 Exitflag(OkFlag) 55 operation(connection_) 59 56 { 60 57 Info info(__FUNCTION__); 61 // Resolve the host name into an IP address.62 boost::asio::ip::tcp::resolver resolver(io_service);63 boost::asio::ip::tcp::resolver::query query(host, service);64 boost::asio::ip::tcp::resolver::iterator endpoint_iterator =65 resolver.resolve(query);66 boost::asio::ip::tcp::endpoint endpoint = *endpoint_iterator;67 58 68 // Start an asynchronous connect operation. 69 std::cout << "Connecting to endpoint " << endpoint << std::endl; 70 connection_.socket().async_connect(endpoint, 71 boost::bind(&FragmentWorker::handle_connect, this, 72 boost::asio::placeholders::error, ++endpoint_iterator)); 59 // launch operation 60 operation(host, service); 73 61 } 74 62 75 /// Handle completion of a connect operation.76 void FragmentWorker::handle_connect(const boost::system::error_code& e,77 boost::asio::ip::tcp::resolver::iterator endpoint_iterator)78 {79 Info info(__FUNCTION__);80 if (!e)81 {82 // Successfully established connection. Start operation to read the list83 // of jobs. The connection::async_read() function will automatically84 // decode the data that is read from the underlying socket.85 LOG(1, "INFO: Receiving a job ...");86 connection_.async_read(job,87 boost::bind(&FragmentWorker::handle_ReceiveJob, this,88 boost::asio::placeholders::error));89 } else if (endpoint_iterator != boost::asio::ip::tcp::resolver::iterator()) {90 // Try the next endpoint.91 connection_.socket().close();92 boost::asio::ip::tcp::endpoint endpoint = *endpoint_iterator;93 connection_.socket().async_connect(endpoint,94 boost::bind(&FragmentWorker::handle_connect, this,95 boost::asio::placeholders::error, ++endpoint_iterator));96 } else {97 // An error occurred. Log it and return. Since we are not starting a new98 // operation the io_service will run out of work to do and the client will99 // exit.100 Exitflag = ErrorFlag;101 ELOG(1, e.message());102 }103 }104 105 /// Callback function when job has been received.106 void FragmentWorker::handle_ReceiveJob(const boost::system::error_code& e)107 {108 Info info(__FUNCTION__);109 if (!e)110 {111 LOG(1, "INFO: Received job #" << job->getId() << ".");112 if (job->getId() != JobId::NoJob) {113 // Print out the data that was received.114 std::cout << "Job id: " << job->getId() << "\n";115 116 // do something .. right now: wait117 LOG(1, "INFO: Calculating job #" << job->getId() << " ...");118 FragmentResult::ptr result(job->Work());119 120 // write the result to the server121 LOG(1, "INFO: Sending result for job #" << job->getId() << " ...");122 connection_.async_write(result,123 boost::bind(&FragmentWorker::handle_SendResult, this,124 boost::asio::placeholders::error));125 126 } else {127 std::cout << "The server has no job for me." << std::endl;128 // send out empty result129 LOG(1, "INFO: Sending empty result ...");130 connection_.async_write(EmptyResult,131 boost::bind(&FragmentWorker::handle_SendResult, this,132 boost::asio::placeholders::error));133 Exitflag = NoJobFlag;134 }135 }136 else137 {138 // An error occurred.139 Exitflag = ErrorFlag;140 ELOG(1, e.message());141 }142 143 // Since we are not starting a new operation the io_service will run out of144 // work to do and the client will exit.145 }146 147 /// Callback function when result has been sent.148 void FragmentWorker::handle_SendResult(const boost::system::error_code& e)149 {150 Info info(__FUNCTION__);151 // Nothing to do.152 LOG(1, "INFO: Job #" << job->getId() << " calculated and sent.");153 // erase job154 job.reset();155 }156 -
src/Fragmentation/Automation/FragmentWorker.hpp
r8036b7 r95454a 18 18 #include "Connection.hpp" 19 19 #include "Jobs/FragmentJob.hpp" 20 #include "Controller/Commands/WorkOnJobOperation.hpp" 20 21 21 22 /** Receives a job from Server to execute and return FragmentResult. … … 29 30 const std::string& host, const std::string& service); 30 31 31 enum Exitflag_t {32 OkFlag = 0,33 NoJobFlag = 1,34 ErrorFlag = 25535 };36 37 32 /** Returns the flag of the handled operation. 38 33 * … … 40 35 size_t getExitflag() const 41 36 { 42 return Exitflag;37 return operation.getExitflag(); 43 38 } 44 39 45 protected:46 /// Handle completion of a connect operation.47 void handle_connect(const boost::system::error_code& e,48 boost::asio::ip::tcp::resolver::iterator endpoint_iterator);49 50 /// Callback function when job has been received.51 void handle_ReceiveJob(const boost::system::error_code& e);52 53 /// Callback function when result has been sent.54 void handle_SendResult(const boost::system::error_code& e);55 56 40 private: 57 // static entity of an empty result58 static FragmentResult::ptr EmptyResult;59 60 41 /// The Connection to the server. 61 42 Connection connection_; 62 43 63 /// The data received from the server. 64 FragmentJob::ptr job; 65 66 /// The result created to be sent to the server. 67 FragmentResult result; 68 69 /// exit flag to give at program exit 70 enum Exitflag_t Exitflag; 44 //!> operation that handles connection, getting, and working on job. 45 WorkOnJobOperation operation; 71 46 }; 72 47 -
src/Fragmentation/Automation/Makefile.am
r8036b7 r95454a 96 96 97 97 WORKERSOURCE = \ 98 Controller/Commands/WorkOnJobOperation.cpp \ 98 99 FragmentWorker.cpp \ 99 100 Worker.cpp … … 101 102 WORKERHEADER = \ 102 103 Connection.hpp \ 104 Controller/Commands/WorkOnJobOperation.hpp \ 103 105 FragmentWorker.hpp 104 106
Note:
See TracChangeset
for help on using the changeset viewer.