summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/sys/apr
diff options
context:
space:
mode:
authorAndrew Stitcher <astitcher@apache.org>2007-07-27 17:19:30 +0000
committerAndrew Stitcher <astitcher@apache.org>2007-07-27 17:19:30 +0000
commit65ea2f177bd0810590895d89a490af8cea60253b (patch)
tree1a1432d706ac5f43dc8cdd5fdb0d7b5566dd5d06 /cpp/src/qpid/sys/apr
parent0a7f3f5dde40e59e90588e4ab7ba2ba99651c0f4 (diff)
downloadqpid-python-65ea2f177bd0810590895d89a490af8cea60253b.tar.gz
* 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
Diffstat (limited to 'cpp/src/qpid/sys/apr')
-rw-r--r--cpp/src/qpid/sys/apr/APRAcceptor.cpp2
-rw-r--r--cpp/src/qpid/sys/apr/Socket.cpp58
-rw-r--r--cpp/src/qpid/sys/apr/Socket.h75
3 files changed, 43 insertions, 92 deletions
diff --git a/cpp/src/qpid/sys/apr/APRAcceptor.cpp b/cpp/src/qpid/sys/apr/APRAcceptor.cpp
index 8662e602c2..b353b698ef 100644
--- a/cpp/src/qpid/sys/apr/APRAcceptor.cpp
+++ b/cpp/src/qpid/sys/apr/APRAcceptor.cpp
@@ -56,8 +56,6 @@ Acceptor::shared_ptr Acceptor::create(int16_t port, int backlog, int threads, bo
{
return Acceptor::shared_ptr(new APRAcceptor(port, backlog, threads, trace));
}
-// Must define Acceptor virtual dtor.
-Acceptor::~Acceptor() {}
APRAcceptor::APRAcceptor(int16_t port_, int backlog, int threads, bool trace_) :
port(port_),
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 <apr_network_io.h>
+
+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<const char*>(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<char*>(data), &received);
@@ -83,4 +111,4 @@ ssize_t Socket::recv(void* data, size_t size)
return received;
}
-
+}} // namespace qpid::sys
diff --git a/cpp/src/qpid/sys/apr/Socket.h b/cpp/src/qpid/sys/apr/Socket.h
deleted file mode 100644
index c20c36dcd9..0000000000
--- a/cpp/src/qpid/sys/apr/Socket.h
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef _sys_apr_Socket_h
-#define _sys_apr_Socket_h
-
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include <string>
-#include "qpid/sys/Time.h"
-
-#include <apr_network_io.h>
-
-namespace qpid {
-namespace sys {
-
-class Socket
-{
- public:
- /** Create an initialized TCP socket */
- static Socket createTcp();
-
- /** Create a socket wrapper for descriptor. */
- Socket(apr_socket_t* descriptor = 0);
-
- /** Set timeout for read and write */
- void setTimeout(const Duration& interval);
-
- void connect(const std::string& host, int port);
-
- void close();
-
- enum { SOCKET_TIMEOUT=-2, SOCKET_EOF=-3 } ErrorCode;
-
- /** Returns bytes sent or an ErrorCode value < 0. */
- ssize_t send(const void* data, size_t size);
-
- /**
- * Returns bytes received, an ErrorCode value < 0 or 0
- * if the connection closed in an orderly manner.
- */
- ssize_t recv(void* data, size_t size);
-
- /** Bind to a port and start listening.
- *@param port 0 means choose an available port.
- *@param backlog maximum number of pending connections.
- *@return The bound port.
- */
- int listen(int port = 0, int backlog = 10);
-
- /** Get file descriptor */
- int fd();
-
- private:
- apr_socket_t* socket;
-};
-
-}}
-#endif /*!_sys_Socket_h*/