Commit 9f4ba764 authored by AdamSimpson's avatar AdamSimpson
Browse files

Fix issue with shared_from_this that requires at least one instance of the...

Fix issue with shared_from_this that requires at least one instance of the class to exist, e.g. you can't call it in the constructor.
parent d7bc2da2
Loading
Loading
Loading
Loading
Loading
+15 −10
Original line number Diff line number Diff line
@@ -9,14 +9,21 @@ using asio::ip::tcp;

class Connection : public std::enable_shared_from_this<Connection> {
public:
    explicit Connection(tcp::socket socket, BuilderQueue &queue) : queue(queue)
    {
        logger::write(socket, "Established connection");
    explicit Connection(BuilderQueue &queue) : queue(queue) {}

    ~Connection() {
        logger::write("Ending connection");
    }

    void start(tcp::socket socket) {
        try {
            auto self(shared_from_this());

            logger::write(socket, "Established connection");

            asio::spawn(socket.get_io_service(),
                        [this, self, socket=std::move(socket)](asio::yield_context yield) mutable {

                            Messenger client(std::move(socket), yield);

                            auto request = client.async_receive(MessageType::string);
@@ -27,15 +34,13 @@ public:
                            } else {
                                logger::write(client.socket, "Invalid request message received: " + request);
                            }

                        });
        } catch (std::exception& ex) {
            logger::write(std::string() + "Connection exception: " + ex.what());
        } catch(...) {
            logger::write("Unknown connection exception caught");
        }

            logger::write("Unknown connection exception caught!");
        }

    ~Connection() {
        logger::write("Ending connection");
    }

private:
+5 −5
Original line number Diff line number Diff line
@@ -7,6 +7,11 @@
// We must remove a reservation from the queue if it is destructed but we don't want
// The reservation to have a handle to the queue, else we have a weird circular dependency: reservation<-->queue
class ReservationRequest {
private:
    BuilderQueue &queue;
    Messenger& client;
    Reservation &reservation;

public:
    explicit ReservationRequest(BuilderQueue &queue, Messenger& client) :
                                               queue(queue),
@@ -21,9 +26,4 @@ public:

    BuilderData async_wait();
    boost::system::error_code& error;

private:
    BuilderQueue &queue;
    Messenger& client;
    Reservation &reservation;
};
 No newline at end of file
+1 −2
Original line number Diff line number Diff line
@@ -24,11 +24,10 @@ int main(int argc, char *argv[]) {
                        tcp::socket socket(io_service);
                        boost::system::error_code error;
                        acceptor.async_accept(socket, yield[error]);

                        if (error) {
                            logger::write(socket, "Error accepting new connection");
                        } else {
                            std::make_shared<Connection>(std::move(socket), builder_queue);
                            std::make_shared<Connection>(builder_queue)->start(std::move(socket));
                        }
                    }
                });
+1 −1
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ Messenger Client::connect_to_queue(asio::yield_context yield) {
        wait_queue.stop("Failed\n", logger::severity_level::fatal);
        throw std::runtime_error("Failed to connect to builder queue!");
    }
    wait_queue.stop("", logger::severity_level::success);
    wait_queue.stop("Connected to queue: " + queue_host + ":" + queue_port, logger::severity_level::success);

    return queue_messenger;
}
+2 −1
Original line number Diff line number Diff line
@@ -62,7 +62,8 @@ public:
    // Create a server messenger by doing an async block give the socket
    // The messenger will assume ownership of the socket
    explicit Messenger(tcp::socket socket, asio::yield_context yield) : socket(std::move(socket)),
                                                                        yield(yield) {}
                                                                        yield(yield) {
    }

    std::string async_receive(MessageType type = MessageType::string);