This is an automated email from the ASF dual-hosted git repository.
swebb2066 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git
The following commit(s) were added to refs/heads/master by this push:
new 7c31ffcf Reduce the delay when closing a TelnetAppender (#592)
7c31ffcf is described below
commit 7c31ffcf1f7bd12ec9bb24b69207c9f1fd4cc392
Author: Stephen Webb <[email protected]>
AuthorDate: Sun Feb 1 11:20:46 2026 +1100
Reduce the delay when closing a TelnetAppender (#592)
---
src/main/cpp/aprserversocket.cpp | 31 ++++++++++++++++++++++---------
1 file changed, 22 insertions(+), 9 deletions(-)
diff --git a/src/main/cpp/aprserversocket.cpp b/src/main/cpp/aprserversocket.cpp
index c22c0263..29246d88 100644
--- a/src/main/cpp/aprserversocket.cpp
+++ b/src/main/cpp/aprserversocket.cpp
@@ -33,7 +33,8 @@ namespace helpers
struct APRServerSocket::APRServerSocketPriv : public ServerSocketPrivate {
Pool pool;
std::mutex mutex;
- apr_socket_t* socket;
+ apr_socket_t* socket{ 0 };
+ apr_pollset_t* pSet{ 0 };
};
#if LOG4CXX_ABI_VERSION <= 15
@@ -107,6 +108,8 @@ void APRServerSocket::close()
{
std::lock_guard<std::mutex> lock(_priv->mutex);
+ if (_priv->pSet)
+ apr_pollset_wakeup(_priv->pSet);
if (_priv->socket != 0)
{
apr_status_t status = apr_socket_close(_priv->socket);
@@ -136,17 +139,27 @@ SocketPtr APRServerSocket::accept()
throw NullPointerException(LOG4CXX_STR("socket"));
}
- apr_pollfd_t poll;
- poll.p = _priv->pool.getAPRPool();
- poll.desc_type = APR_POLL_SOCKET;
- poll.reqevents = APR_POLLIN;
- poll.rtnevents = 0;
- poll.desc.s = s;
- poll.client_data = NULL;
+ if (!_priv->pSet)
+ {
+ apr_pollfd_t poll;
+ poll.p = _priv->pool.getAPRPool();
+ poll.desc_type = APR_POLL_SOCKET;
+ poll.reqevents = APR_POLLIN;
+ poll.rtnevents = 0;
+ poll.desc.s = s;
+ poll.client_data = NULL;
+ auto status = apr_pollset_create(&_priv->pSet, 1,
_priv->pool.getAPRPool(), APR_POLLSET_WAKEABLE);
+ if (status != APR_SUCCESS)
+ {
+ throw SocketException(status);
+ }
+ apr_pollset_add(_priv->pSet, &poll);
+ }
+ const apr_pollfd_t* descriptors;
apr_int32_t signaled;
apr_interval_time_t to = _priv->timeout * 1000;
- apr_status_t status = apr_poll(&poll, 1, &signaled, to);
+ apr_status_t status = apr_pollset_poll(_priv->pSet, to, &signaled,
&descriptors);
if (APR_STATUS_IS_TIMEUP(status))
{