| [72eaf7f] | 1 | /*
 | 
|---|
| [cd4a6e] | 2 |  * Project: MoleCuilder
 | 
|---|
 | 3 |  * Description: creates and alters molecular systems
 | 
|---|
 | 4 |  * Copyright (C)  2011 University of Bonn. All rights reserved.
 | 
|---|
 | 5 |  * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
 | 
|---|
 | 6 |  */
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 | /*
 | 
|---|
 | 9 |  * \file FragmentScheduler.cpp
 | 
|---|
 | 10 |  *
 | 
|---|
 | 11 |  * This file strongly follows the Serialization example from the boost::asio
 | 
|---|
 | 12 |  * library (see server.cpp)
 | 
|---|
| [72eaf7f] | 13 |  *
 | 
|---|
| [cd4a6e] | 14 |  *  Created on: Oct 19, 2011
 | 
|---|
| [72eaf7f] | 15 |  *      Author: heber
 | 
|---|
 | 16 |  */
 | 
|---|
 | 17 | 
 | 
|---|
| [f93842] | 18 | // include config.h
 | 
|---|
 | 19 | #ifdef HAVE_CONFIG_H
 | 
|---|
 | 20 | #include <config.h>
 | 
|---|
 | 21 | #endif
 | 
|---|
 | 22 | 
 | 
|---|
| [c6bcd0] | 23 | // boost asio needs specific operator new
 | 
|---|
| [72eaf7f] | 24 | #include <boost/asio.hpp>
 | 
|---|
| [c6bcd0] | 25 | 
 | 
|---|
 | 26 | #include "CodePatterns/MemDebug.hpp"
 | 
|---|
 | 27 | 
 | 
|---|
| [72eaf7f] | 28 | #include <boost/bind.hpp>
 | 
|---|
 | 29 | #include <boost/lexical_cast.hpp>
 | 
|---|
 | 30 | #include <iostream>
 | 
|---|
 | 31 | #include <vector>
 | 
|---|
| [af3aed] | 32 | #include "Connection.hpp" // Must come before boost/serialization headers.
 | 
|---|
| [72eaf7f] | 33 | #include <boost/serialization/vector.hpp>
 | 
|---|
| [af3aed] | 34 | #include "CodePatterns/Info.hpp"
 | 
|---|
| [31ca5f] | 35 | #include "FragmentJob.hpp"
 | 
|---|
| [72eaf7f] | 36 | 
 | 
|---|
| [cd4a6e] | 37 | #include "FragmentScheduler.hpp"
 | 
|---|
| [72eaf7f] | 38 | 
 | 
|---|
| [926a49] | 39 | FragmentScheduler::FragmentScheduler(boost::asio::io_service& io_service, unsigned short port) :
 | 
|---|
| [ed2c5b] | 40 |   acceptor_(io_service,
 | 
|---|
 | 41 |       boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)
 | 
|---|
 | 42 |   )
 | 
|---|
 | 43 | {
 | 
|---|
| [af3aed] | 44 |     Info info(__FUNCTION__);
 | 
|---|
| [31ca5f] | 45 |   FragmentJob s(std::string("test"), 1);
 | 
|---|
 | 46 |   jobs_.push_back(s);
 | 
|---|
| [72eaf7f] | 47 | 
 | 
|---|
| [ed2c5b] | 48 |   // Start an accept operation for a new connection.
 | 
|---|
| [af3aed] | 49 |   connection_ptr new_conn(new Connection(acceptor_.get_io_service()));
 | 
|---|
| [ed2c5b] | 50 |   acceptor_.async_accept(new_conn->socket(),
 | 
|---|
| [926a49] | 51 |     boost::bind(&FragmentScheduler::handle_accept, this,
 | 
|---|
| [ed2c5b] | 52 |       boost::asio::placeholders::error, new_conn));
 | 
|---|
 | 53 | }
 | 
|---|
| [72eaf7f] | 54 | 
 | 
|---|
| [cd4a6e] | 55 | /// Handle completion of a accept operation.
 | 
|---|
| [926a49] | 56 | void FragmentScheduler::handle_accept(const boost::system::error_code& e, connection_ptr conn)
 | 
|---|
| [ed2c5b] | 57 | {
 | 
|---|
| [cd4a6e] | 58 |   Info info(__FUNCTION__);
 | 
|---|
| [ed2c5b] | 59 |   std::cout << "handle_accept called." << std::endl;
 | 
|---|
 | 60 |   if (!e)
 | 
|---|
| [72eaf7f] | 61 |   {
 | 
|---|
| [cd4a6e] | 62 |     // Successfully accepted a new connection. Send the list of jobs to the
 | 
|---|
| [ed2c5b] | 63 |     // client. The connection::async_write() function will automatically
 | 
|---|
 | 64 |     // serialize the data structure for us.
 | 
|---|
| [31ca5f] | 65 |     conn->async_write(jobs_,
 | 
|---|
| [926a49] | 66 |       boost::bind(&FragmentScheduler::handle_write, this,
 | 
|---|
| [ed2c5b] | 67 |       boost::asio::placeholders::error, conn));
 | 
|---|
| [72eaf7f] | 68 | 
 | 
|---|
| [cd4a6e] | 69 |     // Start an accept operation for a new Connection.
 | 
|---|
 | 70 |     connection_ptr new_conn(new Connection(acceptor_.get_io_service()));
 | 
|---|
 | 71 |     acceptor_.async_accept(new_conn->socket(),
 | 
|---|
 | 72 |       boost::bind(&FragmentScheduler::handle_accept, this,
 | 
|---|
| [ed2c5b] | 73 |       boost::asio::placeholders::error, new_conn));
 | 
|---|
| [cd4a6e] | 74 |   }
 | 
|---|
 | 75 |   else
 | 
|---|
 | 76 |   {
 | 
|---|
 | 77 |     // An error occurred. Log it and return. Since we are not starting a new
 | 
|---|
 | 78 |     // accept operation the io_service will run out of work to do and the
 | 
|---|
 | 79 |     // server will exit.
 | 
|---|
 | 80 |     std::cerr << "Error: " << e.message() << std::endl;
 | 
|---|
 | 81 |   }
 | 
|---|
| [ed2c5b] | 82 | }
 | 
|---|
| [72eaf7f] | 83 | 
 | 
|---|
| [cd4a6e] | 84 | /// Handle completion of a write operation.
 | 
|---|
| [926a49] | 85 | void FragmentScheduler::handle_write(const boost::system::error_code& e, connection_ptr conn)
 | 
|---|
| [ed2c5b] | 86 | {
 | 
|---|
| [af3aed] | 87 |     Info info(__FUNCTION__);
 | 
|---|
| [ed2c5b] | 88 |   // Nothing to do. The socket will be closed automatically when the last
 | 
|---|
 | 89 |   // reference to the connection object goes away.
 | 
|---|
 | 90 | }
 | 
|---|
| [cd4a6e] | 91 | 
 | 
|---|