diff --git a/src/core/connection.cpp b/src/core/connection.cpp --- a/src/core/connection.cpp +++ b/src/core/connection.cpp @@ -35,6 +35,56 @@ #include #include +#ifdef Q_OS_FREEBSD +#include +#include + +void adjustSocketBuffer( int real_fd ) +{ + int so_data = 0; + socklen_t so_len = sizeof(so_data); + int r = getsockopt(real_fd, SOL_SOCKET, SO_SNDBUF, &so_data, &so_len); + qDebug() << "SNDBUF" << r << so_data; + if (!r && (so_data < 65536)) + { + so_data = 65536; + r = setsockopt(real_fd, SOL_SOCKET, SO_SNDBUF, &so_data, sizeof(so_data)); + if (r) + qCDebug(AKONADICORE_LOG) << "Could not enlarge send buffer" << r; + } + r = getsockopt(real_fd, SOL_SOCKET, SO_SNDBUF, &so_data, &so_len); + qDebug() << "SNDBUF" << r << so_data; + + r = getsockopt(real_fd, SOL_SOCKET, SO_RCVBUF, &so_data, &so_len); + qDebug() << "RCVBUF" << r << so_data; + if (!r && (so_data < 65536)) + { + so_data = 65536; + r = setsockopt(real_fd, SOL_SOCKET, SO_RCVBUF, &so_data, sizeof(so_data)); + if (r) + qCDebug(AKONADICORE_LOG) << "Could not enlarge recv buffer" << r; + } + r = getsockopt(real_fd, SOL_SOCKET, SO_RCVBUF, &so_data, &so_len); + qDebug() << "RCVBUF" << r << so_data; +} + +static void _adjustSocketBuffer( QLocalSocket* sock ) +{ + qintptr fd = sock->socketDescriptor(); + int real_fd = static_cast(fd); + if ((fd != -1) && (real_fd >= 0)) + { + adjustSocketBuffer( real_fd ); + } + else + qDebug() << "No socket descriptor." << fd << real_fd; + qDebug() << "Qreadbuf" << sock->readBufferSize(); + if (sock->readBufferSize() < 65536) + sock->setReadBufferSize(65536); + qDebug() << "Qreadbuf" << sock->readBufferSize(); +} +#endif + using namespace Akonadi; Connection::Connection(ConnectionType connType, const QByteArray &sessionId, QObject *parent) @@ -149,6 +199,21 @@ }); connect(mSocket, &QLocalSocket::disconnected, this, &Connection::socketDisconnected); connect(mSocket, &QLocalSocket::readyRead, this, &Connection::dataReceived); +#ifdef Q_OS_FREEBSD + connect(mSocket, static_cast(&QLocalSocket::connected), this, + [this]() + { + qDebug() << "Connected"; + _adjustSocketBuffer(mSocket); + }); + connect(mSocket, static_cast(&QLocalSocket::stateChanged), this, + [this](QLocalSocket::LocalSocketState state) + { + qDebug() << "StateChange" << state; + if ((state == QLocalSocket::ConnectingState) || (state == QLocalSocket::ConnectedState)) + _adjustSocketBuffer(mSocket); + }); +#endif } // actually do connect diff --git a/src/server/aklocalserver.h b/src/server/aklocalserver.h --- a/src/server/aklocalserver.h +++ b/src/server/aklocalserver.h @@ -33,6 +33,10 @@ public: explicit AkLocalServer(QObject *parent = nullptr); +#ifdef Q_OS_FREEBSD + bool listen(const QString &name); +#endif + Q_SIGNALS: void newConnection(quintptr socketDescriptor); diff --git a/src/server/aklocalserver.cpp b/src/server/aklocalserver.cpp --- a/src/server/aklocalserver.cpp +++ b/src/server/aklocalserver.cpp @@ -31,3 +31,24 @@ Q_EMIT newConnection(socketDescriptor); } +#ifdef Q_OS_FREEBSD +extern void adjustSocketBuffer( int real_fd ); + +bool AkLocalServer::listen( const QString& name ) +{ + qDebug() << "listen" << name; + bool r = QLocalServer::listen(name); + if (r) + { + qintptr fd = -1; // QLocalServer::socketDescriptor(); // new in Qt 5.10 + int real_fd = static_cast(fd); + if ((fd != -1) && (real_fd >= 0)) + { + adjustSocketBuffer( real_fd ); + } + else + qDebug() << "AkLocalServer No socket descriptor." << fd << real_fd; + } + return r; +} +#endif diff --git a/src/server/connection.cpp b/src/server/connection.cpp --- a/src/server/connection.cpp +++ b/src/server/connection.cpp @@ -52,6 +52,41 @@ return id; } +#ifdef Q_OS_FREEBSD +#include +#include + +void adjustSocketBuffer( int real_fd ) +{ + int so_data = 0; + socklen_t so_len = sizeof(so_data); + int r = getsockopt(real_fd, SOL_SOCKET, SO_SNDBUF, &so_data, &so_len); + qDebug() << "SNDBUF" << r << so_data; + if (!r && (so_data < 65536)) + { + so_data = 65536; + r = setsockopt(real_fd, SOL_SOCKET, SO_SNDBUF, &so_data, sizeof(so_data)); + if (r) + qCDebug(AKONADISERVER_LOG) << "Could not enlarge send buffer" << r; + } + r = getsockopt(real_fd, SOL_SOCKET, SO_SNDBUF, &so_data, &so_len); + qDebug() << "SNDBUF" << r << so_data; + + r = getsockopt(real_fd, SOL_SOCKET, SO_RCVBUF, &so_data, &so_len); + qDebug() << "RCVBUF" << r << so_data; + if (!r && (so_data < 65536)) + { + so_data = 65536; + r = setsockopt(real_fd, SOL_SOCKET, SO_RCVBUF, &so_data, sizeof(so_data)); + if (r) + qCDebug(AKONADISERVER_LOG) << "Could not enlarge recv buffer" << r; + } + r = getsockopt(real_fd, SOL_SOCKET, SO_RCVBUF, &so_data, &so_len); + qDebug() << "RCVBUF" << r << so_data; +} + +#endif + Connection::Connection(QObject *parent) : AkThread(connectionIdentifier(this), QThread::InheritPriority, parent) , m_socketDescriptor(0) @@ -70,6 +105,10 @@ Connection::Connection(quintptr socketDescriptor, QObject *parent) : Connection(parent) { +#ifdef Q_OS_FREEBSD + int real_fd = static_cast(socketDescriptor); + adjustSocketBuffer( real_fd ); +#endif m_socketDescriptor = socketDescriptor; m_identifier = connectionIdentifier(this); // same as objectName()