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))
        {

Reply via email to