From 65ea2f177bd0810590895d89a490af8cea60253b Mon Sep 17 00:00:00 2001 From: Andrew Stitcher Date: Fri, 27 Jul 2007 17:19:30 +0000 Subject: * Asynchronous network IO subsystem - This is now implemented such that it very nearly only depends on the platform code (Socker & Poller), this is not 100% true at present, but should be simple to finish. - This is still not the default (use "./configure --disable-apr-netio" to get it) - Interrupting the broker gives a known error - Default for number of broker io threads is not correct (needs to be number of CPUs - it will run slower with too many io threads) * EventChannel code - Deleted all EventChannel code as it's entirely superceded by this new shiny code ;-) * Rearranged the platform Socket implementations a bit for better abstraction git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@560323 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/sys/apr/Socket.cpp | 58 ++++++++++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 15 deletions(-) (limited to 'cpp/src/qpid/sys/apr/Socket.cpp') diff --git a/cpp/src/qpid/sys/apr/Socket.cpp b/cpp/src/qpid/sys/apr/Socket.cpp index 6e64d656d2..577268844a 100644 --- a/cpp/src/qpid/sys/apr/Socket.cpp +++ b/cpp/src/qpid/sys/apr/Socket.cpp @@ -20,31 +20,56 @@ */ -#include "Socket.h" +#include "qpid/sys/Socket.h" + #include "APRBase.h" #include "APRPool.h" +#include + +namespace qpid { +namespace sys { + +class SocketPrivate { +public: + SocketPrivate(apr_socket_t* s = 0) : + socket(s) + {} + + apr_socket_t* socket; +}; + +Socket::Socket() : + impl(new SocketPrivate) +{ + createTcp(); +} + +Socket::Socket(SocketPrivate* sp) : + impl(sp) +{} -using namespace qpid::sys; +Socket::~Socket() { + delete impl; +} -Socket Socket::createTcp() { - Socket s; +void Socket::createTcp() const { + apr_socket_t*& socket = impl->socket; + apr_socket_t* s; CHECK_APR_SUCCESS( apr_socket_create( - &s.socket, APR_INET, SOCK_STREAM, APR_PROTO_TCP, + &s, APR_INET, SOCK_STREAM, APR_PROTO_TCP, APRPool::get())); - return s; -} - -Socket::Socket(apr_socket_t* s) { socket = s; } -void Socket::setTimeout(const Duration& interval) { +void Socket::setTimeout(const Duration& interval) const { + apr_socket_t*& socket = impl->socket; apr_socket_timeout_set(socket, interval/TIME_USEC); } -void Socket::connect(const std::string& host, int port) { +void Socket::connect(const std::string& host, int port) const { + apr_socket_t*& socket = impl->socket; apr_sockaddr_t* address; CHECK_APR_SUCCESS( apr_sockaddr_info_get( @@ -53,14 +78,16 @@ void Socket::connect(const std::string& host, int port) { CHECK_APR_SUCCESS(apr_socket_connect(socket, address)); } -void Socket::close() { +void Socket::close() const { + apr_socket_t*& socket = impl->socket; if (socket == 0) return; CHECK_APR_SUCCESS(apr_socket_close(socket)); socket = 0; } -ssize_t Socket::send(const void* data, size_t size) +ssize_t Socket::send(const void* data, size_t size) const { + apr_socket_t*& socket = impl->socket; apr_size_t sent = size; apr_status_t status = apr_socket_send(socket, reinterpret_cast(data), &sent); @@ -70,8 +97,9 @@ ssize_t Socket::send(const void* data, size_t size) return sent; } -ssize_t Socket::recv(void* data, size_t size) +ssize_t Socket::recv(void* data, size_t size) const { + apr_socket_t*& socket = impl->socket; apr_size_t received = size; apr_status_t status = apr_socket_recv(socket, reinterpret_cast(data), &received); @@ -83,4 +111,4 @@ ssize_t Socket::recv(void* data, size_t size) return received; } - +}} // namespace qpid::sys -- cgit v1.2.1