This is an automated email from the ASF dual-hosted git repository.

swebb2066 pushed a commit to branch simplify_appender_interface
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git

commit a74f8e79d40121f42ecc7bba08ad9ba21a9c80ac
Author: Stephen Webb <[email protected]>
AuthorDate: Sat Mar 7 17:31:09 2026 +1100

    Deprecate AppenderSkeleton::finalize in the next ABI version
---
 src/main/cpp/appenderskeleton.cpp                  |  2 +
 src/main/cpp/asyncappender.cpp                     | 22 ++++---
 src/main/cpp/consoleappender.cpp                   |  9 +--
 src/main/cpp/dbappender.cpp                        | 20 ++++--
 src/main/cpp/fileappender.cpp                      |  7 +--
 src/main/cpp/multiprocessrollingfileappender.cpp   |  8 +--
 src/main/cpp/nteventlogappender.cpp                |  7 ++-
 src/main/cpp/odbcappender.cpp                      | 64 +++++++++++--------
 src/main/cpp/rollingfileappender.cpp               |  8 +--
 src/main/cpp/smtpappender.cpp                      |  2 +-
 src/main/cpp/socketappenderskeleton.cpp            |  8 +--
 src/main/cpp/syslogappender.cpp                    |  2 +-
 src/main/cpp/telnetappender.cpp                    | 27 +++++---
 src/main/cpp/writerappender.cpp                    | 71 +++++++++++++---------
 src/main/cpp/xmlsocketappender.cpp                 | 19 ++++--
 src/main/include/log4cxx/appenderskeleton.h        |  4 +-
 .../include/log4cxx/net/socketappenderskeleton.h   |  3 +-
 src/main/include/log4cxx/net/xmlsocketappender.h   |  3 +-
 .../include/log4cxx/private/odbcappender_priv.h    |  3 +
 .../log4cxx/private/socketappenderskeleton_priv.h  |  7 ++-
 .../include/log4cxx/private/writerappender_priv.h  | 10 +++
 src/main/include/log4cxx/writerappender.h          |  7 ++-
 22 files changed, 196 insertions(+), 117 deletions(-)

diff --git a/src/main/cpp/appenderskeleton.cpp 
b/src/main/cpp/appenderskeleton.cpp
index ec7c44f7..12c083fd 100644
--- a/src/main/cpp/appenderskeleton.cpp
+++ b/src/main/cpp/appenderskeleton.cpp
@@ -50,6 +50,7 @@ AppenderSkeleton::AppenderSkeleton(const LayoutPtr& layout)
 
 AppenderSkeleton::~AppenderSkeleton() {}
 
+#if LOG4CXX_ABI_VERSION <= 15
 void AppenderSkeleton::finalize()
 {
        // An appender might be closed then garbage collected. There is no
@@ -61,6 +62,7 @@ void AppenderSkeleton::finalize()
 
        close();
 }
+#endif
 
 void AppenderSkeleton::addFilter(const spi::FilterPtr newFilter)
 {
diff --git a/src/main/cpp/asyncappender.cpp b/src/main/cpp/asyncappender.cpp
index 8443d46f..546bd7c6 100644
--- a/src/main/cpp/asyncappender.cpp
+++ b/src/main/cpp/asyncappender.cpp
@@ -135,6 +135,7 @@ typedef std::map<LogString, DiscardSummary> DiscardMap;
 
 struct AsyncAppender::AsyncAppenderPriv : public 
AppenderSkeleton::AppenderSkeletonPrivate
 {
+       using BaseType = AppenderSkeleton::AppenderSkeletonPrivate;
        AsyncAppenderPriv()
                : AppenderSkeletonPrivate()
                , buffer(DEFAULT_BUFFER_SIZE)
@@ -152,7 +153,8 @@ struct AsyncAppender::AsyncAppenderPriv : public 
AppenderSkeleton::AppenderSkele
 
        ~AsyncAppenderPriv()
        {
-               stopDispatcher();
+               if (setClosed())
+                       close();
        }
 
        /**
@@ -195,7 +197,6 @@ struct AsyncAppender::AsyncAppenderPriv : public 
AppenderSkeleton::AppenderSkele
 
        void stopDispatcher()
        {
-               this->setClosed();
                bufferNotEmpty.notify_all();
                bufferNotFull.notify_all();
 
@@ -205,6 +206,8 @@ struct AsyncAppender::AsyncAppenderPriv : public 
AppenderSkeleton::AppenderSkele
                }
        }
 
+       void close();
+
        /**
         * Should location info be included in dispatched messages.
        */
@@ -240,10 +243,10 @@ struct AsyncAppender::AsyncAppenderPriv : public 
AppenderSkeleton::AppenderSkele
                return this->closed;
        }
 
-       void setClosed()
+       bool setClosed()
        {
                std::lock_guard<std::mutex> lock(this->bufferMutex);
-               this->closed = true;
+               return BaseType::setClosed();
        }
 
        /**
@@ -264,7 +267,6 @@ AsyncAppender::AsyncAppender()
 
 AsyncAppender::~AsyncAppender()
 {
-       finalize();
 }
 
 void AsyncAppender::addAppender(const AppenderPtr newAppender)
@@ -402,8 +404,14 @@ void AsyncAppender::append(const spi::LoggingEventPtr& 
event, Pool& p)
 
 void AsyncAppender::close()
 {
-       priv->stopDispatcher();
-       for (auto item : priv->appenders.getAllAppenders())
+       if (priv->setClosed())
+               priv->close();
+}
+
+void AsyncAppender::AsyncAppenderPriv::close()
+{
+       this->stopDispatcher();
+       for (auto item : this->appenders.getAllAppenders())
        {
                item->close();
        }
diff --git a/src/main/cpp/consoleappender.cpp b/src/main/cpp/consoleappender.cpp
index 9e5b5b83..87d0a007 100644
--- a/src/main/cpp/consoleappender.cpp
+++ b/src/main/cpp/consoleappender.cpp
@@ -50,7 +50,7 @@ ConsoleAppender::ConsoleAppender(const LayoutPtr& layout)
 {
        setLayout(layout);
        Pool p;
-       setWriter(std::make_shared<SystemOutWriter>());
+       _priv->setWriter(std::make_shared<SystemOutWriter>());
        WriterAppender::activateOptions(p);
 }
 
@@ -65,7 +65,6 @@ ConsoleAppender::ConsoleAppender(const LayoutPtr& layout, 
const LogString& targe
 
 ConsoleAppender::~ConsoleAppender()
 {
-       finalize();
 }
 
 const LogString& ConsoleAppender::getSystemOut()
@@ -117,14 +116,12 @@ void ConsoleAppender::activateOptions(Pool& p)
        if (StringHelper::equalsIgnoreCase(_priv->target,
                        LOG4CXX_STR("SYSTEM.OUT"), LOG4CXX_STR("system.out")))
        {
-               WriterPtr writer1 = std::make_shared<SystemOutWriter>();
-               setWriter(writer1);
+               _priv->setWriter(std::make_shared<SystemOutWriter>());
        }
        else if (StringHelper::equalsIgnoreCase(_priv->target,
                        LOG4CXX_STR("SYSTEM.ERR"), LOG4CXX_STR("system.err")))
        {
-               WriterPtr writer1 = std::make_shared<SystemErrWriter>();
-               setWriter(writer1);
+               _priv->setWriter(std::make_shared<SystemErrWriter>());
        }
 
        WriterAppender::activateOptions(p);
diff --git a/src/main/cpp/dbappender.cpp b/src/main/cpp/dbappender.cpp
index 846c79b3..ed3582c2 100644
--- a/src/main/cpp/dbappender.cpp
+++ b/src/main/cpp/dbappender.cpp
@@ -72,6 +72,8 @@ struct DBAppender::DBAppenderPriv : public 
AppenderSkeleton::AppenderSkeletonPri
     std::string sqlStatement;
     Pool m_pool;
     std::vector<pattern::LoggingEventPatternConverterPtr> converters;
+
+    void close();
 };
 
 #define RULES_PUT(spec, cls) \
@@ -106,17 +108,23 @@ DBAppender::DBAppender()
 
 DBAppender::~DBAppender()
 {
-    close();
+    if (_priv->setClosed())
+        _priv->close();
 }
 
 void DBAppender::close()
 {
-    _priv->setClosed();
-    if(_priv->m_driver && _priv->m_databaseHandle){
-        apr_dbd_close(_priv->m_driver, _priv->m_databaseHandle);
+    if (_priv->setClosed())
+        _priv->close();
+}
+
+void DBAppender::DBAppenderPriv::close()
+{
+    if(this->m_driver && this->m_databaseHandle){
+        apr_dbd_close(this->m_driver, this->m_databaseHandle);
     }
-    _priv->m_driver = nullptr;
-    _priv->m_databaseHandle = nullptr;
+    this->m_driver = nullptr;
+    this->m_databaseHandle = nullptr;
 }
 
 void DBAppender::setOption(const LogString& option, const LogString& value){
diff --git a/src/main/cpp/fileappender.cpp b/src/main/cpp/fileappender.cpp
index b2350c73..0f7fc249 100644
--- a/src/main/cpp/fileappender.cpp
+++ b/src/main/cpp/fileappender.cpp
@@ -81,7 +81,6 @@ FileAppender::FileAppender(std::unique_ptr<FileAppenderPriv> 
priv)
 
 FileAppender::~FileAppender()
 {
-       finalize();
        if (auto p = _priv->taskManager.lock())
                p->value().removePeriodicTask(getName());
 }
@@ -297,7 +296,7 @@ void FileAppender::setFileInternal(
                setImmediateFlush(false);
        }
 
-       closeWriter();
+       _priv->close();
 
        bool writeBOM = false;
 
@@ -367,13 +366,13 @@ void FileAppender::setFileInternal(
                newWriter = std::make_shared<BufferedWriter>(newWriter, 
bufferSize1);
        }
 
-       setWriterInternal(newWriter);
+       _priv->setWriter(newWriter);
 
        _priv->fileAppend = append1;
        _priv->bufferedIO = bufferedIO1;
        _priv->fileName = filename;
        _priv->bufferSize = (int)bufferSize1;
-       writeHeader(p);
+       _priv->writeHeader();
 
 }
 
diff --git a/src/main/cpp/multiprocessrollingfileappender.cpp 
b/src/main/cpp/multiprocessrollingfileappender.cpp
index 9b1f061f..590e9003 100644
--- a/src/main/cpp/multiprocessrollingfileappender.cpp
+++ b/src/main/cpp/multiprocessrollingfileappender.cpp
@@ -273,7 +273,7 @@ bool 
MultiprocessRollingFileAppender::synchronizedRollover(Pool& p, const Trigge
                        ;
                else if (auto rollover1 = 
_priv->rollingPolicy->rollover(fileName, getAppend(), p))
                {
-                       closeWriter();
+                       _priv->close();
                        if (rollover1->getActiveFileName() == fileName)
                        {
                                bool success = true; // A synchronous action is 
not required
@@ -326,7 +326,7 @@ bool 
MultiprocessRollingFileAppender::synchronizedRollover(Pool& p, const Trigge
                                        ( rollover1->getActiveFileName()
                                        , rollover1->getAppend()
                                        );
-                               setWriterInternal(createWriter(os));
+                               _priv->setWriter(createWriter(os));
 
                                bool success = true; // A synchronous action is 
not required
                                if (auto pAction = rollover1->getSynchronous())
@@ -372,7 +372,7 @@ bool 
MultiprocessRollingFileAppender::synchronizedRollover(Pool& p, const Trigge
  */
 void MultiprocessRollingFileAppender::reopenFile(const LogString& fileName)
 {
-       closeWriter();
+       _priv->close();
 #if USING_ROLLOVER_REQUIRED_CHECK_IS_FASTER
        if (auto pTimeBased = 
LOG4CXX_NS::cast<TimeBasedRollingPolicy>(_priv->rollingPolicy))
                pTimeBased->loadLastFileName();
@@ -380,7 +380,7 @@ void MultiprocessRollingFileAppender::reopenFile(const 
LogString& fileName)
        OutputStreamPtr os = std::make_shared<FileOutputStream>(fileName, true);
        WriterPtr newWriter(createWriter(os));
        setFile(fileName);
-       setWriter(newWriter);
+       _priv->setWriter(newWriter);
 }
 
 /**
diff --git a/src/main/cpp/nteventlogappender.cpp 
b/src/main/cpp/nteventlogappender.cpp
index e00ff4a4..ef3dd59f 100644
--- a/src/main/cpp/nteventlogappender.cpp
+++ b/src/main/cpp/nteventlogappender.cpp
@@ -129,14 +129,15 @@ NTEventLogAppender::NTEventLogAppender(const LogString& 
server, const LogString&
 
 NTEventLogAppender::~NTEventLogAppender()
 {
-       finalize();
+       if (priv->setClosed())
+               priv->close();
 }
 
 
 void NTEventLogAppender::close()
 {
-       priv->setClosed();
-       priv->close();
+       if (priv->setClosed())
+               priv->close();
 }
 
 void NTEventLogAppender::NTEventLogAppenderPrivate::close()
diff --git a/src/main/cpp/odbcappender.cpp b/src/main/cpp/odbcappender.cpp
index 4616b2f8..6421ccec 100644
--- a/src/main/cpp/odbcappender.cpp
+++ b/src/main/cpp/odbcappender.cpp
@@ -123,9 +123,9 @@ ODBCAppender::ODBCAppender()
 #if LOG4CXX_EVENTS_AT_EXIT
                [this] {
                        std::lock_guard<std::recursive_mutex> 
lock(_priv->mutex);
-                       if(_priv->closed)
-                               return;
-                       try
+                       if(_priv->buffer.empty() || _priv->closed)
+                               ;
+                       else try
                        {
                                flushBuffer(_priv->pool);
                        }
@@ -142,7 +142,8 @@ ODBCAppender::ODBCAppender()
 
 ODBCAppender::~ODBCAppender()
 {
-       finalize();
+       if (_priv->setClosed())
+               _priv->close();
 }
 
 #define RULES_PUT(spec, cls) \
@@ -376,35 +377,41 @@ ODBCAppender::SQLHDBC 
ODBCAppender::getConnection(LOG4CXX_NS::helpers::Pool& p)
 
 void ODBCAppender::close()
 {
-       if (_priv->closed)
+       if (_priv->setClosed())
        {
-               return;
+               if (!_priv->buffer.empty() && 0 == _priv->preparedStatement)
+               {
+                       Pool p;
+                       _priv->setPreparedStatement(getConnection(p), p);
+               }
+               _priv->close();
        }
+}
 
-       Pool p;
-
+void ODBCAppender::ODBCAppenderPriv::close()
+{
        try
        {
+               Pool p;
                flushBuffer(p);
        }
        catch (SQLException& e)
        {
-               _priv->errorHandler->error(LOG4CXX_STR("Error closing 
connection"),
+               this->errorHandler->error(LOG4CXX_STR("Error closing 
connection"),
                        e, ErrorCode::GENERIC_FAILURE);
        }
-       _priv->setClosed();
 
 #if LOG4CXX_HAVE_ODBC
 
-       if (_priv->connection != SQL_NULL_HDBC)
+       if (this->connection != SQL_NULL_HDBC)
        {
-               SQLDisconnect(_priv->connection);
-               SQLFreeHandle(SQL_HANDLE_DBC, _priv->connection);
+               SQLDisconnect(this->connection);
+               SQLFreeHandle(SQL_HANDLE_DBC, this->connection);
        }
 
-       if (_priv->env != SQL_NULL_HENV)
+       if (this->env != SQL_NULL_HENV)
        {
-               SQLFreeHandle(SQL_HANDLE_ENV, _priv->env);
+               SQLFreeHandle(SQL_HANDLE_ENV, this->env);
        }
 
 #endif
@@ -585,32 +592,39 @@ void 
ODBCAppender::ODBCAppenderPriv::setParameterValues(const spi::LoggingEventP
 
 void ODBCAppender::flushBuffer(Pool& p)
 {
-       for (auto& logEvent : _priv->buffer)
+       if (0 == _priv->preparedStatement)
+               _priv->setPreparedStatement(getConnection(p), p);
+       _priv->flushBuffer(p);
+}
+
+void ODBCAppender::ODBCAppenderPriv::flushBuffer(Pool& p)
+{
+       if (0 == this->preparedStatement)
+               ;
+       else for (auto& logEvent : this->buffer)
        {
-               if (_priv->parameterValue.empty())
-                       _priv->errorHandler->error(LOG4CXX_STR("ODBCAppender 
column mappings not defined"));
+               if (this->parameterValue.empty())
+                       this->errorHandler->error(LOG4CXX_STR("ODBCAppender 
column mappings not defined"));
 #if LOG4CXX_HAVE_ODBC
                else try
                {
-                       if (0 == _priv->preparedStatement)
-                               _priv->setPreparedStatement(getConnection(p), 
p);
-                       _priv->setParameterValues(logEvent, p);
-                       auto ret = SQLExecute(_priv->preparedStatement);
+                       this->setParameterValues(logEvent, p);
+                       auto ret = SQLExecute(this->preparedStatement);
                        if (ret < 0)
                        {
-                               throw SQLException(SQL_HANDLE_STMT, 
_priv->preparedStatement, "Failed to execute prepared statement", p);
+                               throw SQLException(SQL_HANDLE_STMT, 
this->preparedStatement, "Failed to execute prepared statement", p);
                        }
                }
                catch (SQLException& e)
                {
-                       _priv->errorHandler->error(LOG4CXX_STR("Failed to 
execute sql"), e,
+                       this->errorHandler->error(LOG4CXX_STR("Failed to 
execute sql"), e,
                                ErrorCode::FLUSH_FAILURE);
                }
 #endif
        }
 
        // clear the buffer of reported events
-       _priv->buffer.clear();
+       this->buffer.clear();
 }
 
 void ODBCAppender::setSql(const LogString& s)
diff --git a/src/main/cpp/rollingfileappender.cpp 
b/src/main/cpp/rollingfileappender.cpp
index 4112864c..657546e5 100644
--- a/src/main/cpp/rollingfileappender.cpp
+++ b/src/main/cpp/rollingfileappender.cpp
@@ -298,7 +298,7 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
                                        {
                                                if 
(rollover1->getActiveFileName() == getFile())
                                                {
-                                                       closeWriter();
+                                                       _priv->close();
 
                                                        bool success = true;
 
@@ -353,7 +353,7 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
                                                }
                                                else
                                                {
-                                                       closeWriter();
+                                                       _priv->close();
                                                        
setFileInternal(rollover1->getActiveFileName());
                                                        // Call activateOptions 
to create any intermediate directories(if required)
                                                        
FileAppender::activateOptionsInternal(p);
@@ -361,7 +361,7 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
                                                                        ( 
rollover1->getActiveFileName()
                                                                        , 
rollover1->getAppend()
                                                                        );
-                                                       
setWriterInternal(createWriter(os));
+                                                       
_priv->setWriter(createWriter(os));
 
                                                        bool success = true;
 
@@ -401,7 +401,7 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
                                                                }
                                                        }
 
-                                                       writeHeader(p);
+                                                       _priv->writeHeader();
                                                }
                                                return true;
                                        }
diff --git a/src/main/cpp/smtpappender.cpp b/src/main/cpp/smtpappender.cpp
index fdf3c489..1165f2e0 100644
--- a/src/main/cpp/smtpappender.cpp
+++ b/src/main/cpp/smtpappender.cpp
@@ -432,7 +432,7 @@ SMTPAppender::SMTPAppender(spi::TriggeringEventEvaluatorPtr 
evaluator)
 
 SMTPAppender::~SMTPAppender()
 {
-       finalize();
+       _priv->setClosed();
 }
 
 bool SMTPAppender::requiresLayout() const
diff --git a/src/main/cpp/socketappenderskeleton.cpp 
b/src/main/cpp/socketappenderskeleton.cpp
index 896c8061..a1a0d8b6 100644
--- a/src/main/cpp/socketappenderskeleton.cpp
+++ b/src/main/cpp/socketappenderskeleton.cpp
@@ -58,7 +58,6 @@ 
SocketAppenderSkeleton::SocketAppenderSkeleton(std::unique_ptr<SocketAppenderSke
 
 SocketAppenderSkeleton::~SocketAppenderSkeleton()
 {
-       finalize();
 }
 
 void SocketAppenderSkeleton::activateOptions(Pool& p)
@@ -69,8 +68,8 @@ void SocketAppenderSkeleton::activateOptions(Pool& p)
 
 void SocketAppenderSkeleton::close()
 {
-       _priv->stopMonitor();
-       cleanUp(_priv->pool);
+       if (_priv->setClosed())
+               _priv->close();
 }
 
 void SocketAppenderSkeleton::connect(Pool& p)
@@ -233,9 +232,8 @@ void SocketAppenderSkeleton::retryConnect()
        }
 }
 
-void SocketAppenderSkeleton::SocketAppenderSkeletonPriv::stopMonitor()
+void SocketAppenderSkeleton::SocketAppenderSkeletonPriv::close()
 {
-       this->setClosed();
        if (this->taskName.empty())
                ;
        else if (auto pManager = this->taskManager.lock())
diff --git a/src/main/cpp/syslogappender.cpp b/src/main/cpp/syslogappender.cpp
index a7d746b4..ccc77a34 100644
--- a/src/main/cpp/syslogappender.cpp
+++ b/src/main/cpp/syslogappender.cpp
@@ -63,7 +63,7 @@ SyslogAppender::SyslogAppender(const LayoutPtr& layout1,
 
 SyslogAppender::~SyslogAppender()
 {
-       finalize();
+       _priv->setClosed();
 }
 
 /** Release any resources held by this SyslogAppender.*/
diff --git a/src/main/cpp/telnetappender.cpp b/src/main/cpp/telnetappender.cpp
index 40506ee0..8ceb248d 100644
--- a/src/main/cpp/telnetappender.cpp
+++ b/src/main/cpp/telnetappender.cpp
@@ -82,8 +82,6 @@ struct TelnetAppender::TelnetAppenderPriv : public 
AppenderSkeletonPrivate
 
        void stopAcceptingConnections()
        {
-               if (!this->setClosed())
-                       return;
                if (!this->serverSocket)
                        return;
                // Interrupt accept()
@@ -97,6 +95,8 @@ struct TelnetAppender::TelnetAppenderPriv : public 
AppenderSkeletonPrivate
                if (this->sh.joinable())
                        this->sh.join();
        }
+
+       void close();
 };
 
 #define _priv static_cast<TelnetAppenderPriv*>(m_priv.get())
@@ -114,7 +114,8 @@ TelnetAppender::TelnetAppender()
 
 TelnetAppender::~TelnetAppender()
 {
-       finalize();
+       if (_priv->setClosed())
+               _priv->close();
 }
 
 void TelnetAppender::activateOptions(Pool& /* p */)
@@ -178,24 +179,30 @@ void TelnetAppender::setEncoding(const LogString& value)
 
 void TelnetAppender::close()
 {
-       _priv->stopAcceptingConnections();
-       std::lock_guard<std::recursive_mutex> lock(_priv->mutex);
-       if (_priv->eventCount && helpers::LogLog::isDebugEnabled())
+       if (_priv->setClosed())
+               _priv->close();
+}
+
+void TelnetAppender::TelnetAppenderPriv::close()
+{
+       this->stopAcceptingConnections();
+       std::lock_guard<std::recursive_mutex> lock(this->mutex);
+       if (this->eventCount && helpers::LogLog::isDebugEnabled())
        {
                Pool p;
                LogString msg = LOG4CXX_STR("TelnetAppender eventCount ");
-               helpers::StringHelper::toString(_priv->eventCount, p, msg);
+               helpers::StringHelper::toString(this->eventCount, p, msg);
                helpers::LogLog::debug(msg);
        }
        SocketPtr nullSocket;
        int connectionNumber{ 0 };
-       for (auto& item : _priv->connections)
+       for (auto& item : this->connections)
        {
                ++connectionNumber;
                if (item.s)
                {
                        item.s->close();
-                       if (_priv->eventCount && 
helpers::LogLog::isDebugEnabled())
+                       if (this->eventCount && 
helpers::LogLog::isDebugEnabled())
                        {
                                Pool p;
                                LogString msg = LOG4CXX_STR("TelnetAppender 
connection ");
@@ -207,7 +214,7 @@ void TelnetAppender::close()
                        item = Connection{ nullSocket, 0 };
                }
        }
-       _priv->activeConnections = 0;
+       this->activeConnections = 0;
 }
 
 
diff --git a/src/main/cpp/writerappender.cpp b/src/main/cpp/writerappender.cpp
index 7830fbd6..c5b02877 100644
--- a/src/main/cpp/writerappender.cpp
+++ b/src/main/cpp/writerappender.cpp
@@ -65,7 +65,8 @@ 
WriterAppender::WriterAppender(std::unique_ptr<WriterAppenderPriv> priv)
 
 WriterAppender::~WriterAppender()
 {
-       finalize();
+       if (_priv->setClosed())
+               _priv->close();
 }
 
 void WriterAppender::activateOptions(Pool& p)
@@ -134,33 +135,25 @@ bool WriterAppender::WriterAppenderPriv::checkWriter()
        return true;
 }
 
-
-
-
-/**
-   Close this appender instance. The underlying stream or writer is
-   also closed.
-
-   <p>Closed appenders cannot be reused.
-
-   @see #setWriter
-   */
 void WriterAppender::close()
 {
-       if (!_priv->setClosed())
-       {
-               return;
-       }
-
-       closeWriter();
+       if (_priv->setClosed())
+               _priv->close();
 }
 
+#if LOG4CXX_ABI_VERSION <= 15
 /**
  * Close the underlying {@link java.io.Writer}.
  * */
 void WriterAppender::closeWriter()
 {
-       if (_priv->writer != NULL)
+        _priv->close();
+}
+#endif
+
+void WriterAppender::WriterAppenderPriv::close()
+{
+       if (this->writer != NULL)
        {
                try
                {
@@ -169,13 +162,13 @@ void WriterAppender::closeWriter()
                        //   Using the object's pool since this is a one-shot 
operation
                        //    and pool is likely to be reclaimed soon when 
appender is destructed.
                        //
-                       writeFooter(_priv->pool);
-                       _priv->writer->close(_priv->pool);
-                       _priv->writer = 0;
+                       this->writeFooter();
+                       this->writer->close(this->pool);
+                       this->writer = 0;
                }
                catch (IOException& e)
                {
-                       LogLog::warn(LOG4CXX_STR("Could not close writer for 
WriterAppender named ") + _priv->name, e);
+                       LogLog::warn(LOG4CXX_STR("Could not close writer for 
WriterAppender named ") + this->name, e);
                }
        }
 
@@ -248,27 +241,42 @@ void WriterAppender::subAppend(const 
spi::LoggingEventPtr& event, Pool& p)
 }
 
 
+#if LOG4CXX_ABI_VERSION <= 15
+void WriterAppender::writeHeader(Pool& p)
+{
+       _priv->writeHeader();
+}
+
 void WriterAppender::writeFooter(Pool& p)
 {
-       if (_priv->layout != NULL)
+       _priv->writeFooter();
+}
+#endif
+
+void WriterAppender::WriterAppenderPriv::writeFooter()
+{
+       if (this->layout != NULL)
        {
+               Pool p;
                LogString foot;
-               _priv->layout->appendFooter(foot, p);
-               _priv->writer->write(foot, p);
+               this->layout->appendFooter(foot, p);
+               this->writer->write(foot, p);
        }
 }
 
-void WriterAppender::writeHeader(Pool& p)
+void WriterAppender::WriterAppenderPriv::writeHeader()
 {
-       if (_priv->layout != NULL)
+       if (this->layout != NULL)
        {
+               Pool p;
                LogString header;
-               _priv->layout->appendHeader(header, p);
-               _priv->writer->write(header, p);
+               this->layout->appendHeader(header, p);
+               this->writer->write(header, p);
        }
 }
 
 
+#if LOG4CXX_ABI_VERSION <= 15
 void WriterAppender::setWriter(const WriterPtr& newWriter)
 {
        std::lock_guard<std::recursive_mutex> lock(_priv->mutex);
@@ -279,6 +287,7 @@ void WriterAppender::setWriterInternal(const WriterPtr& 
newWriter)
 {
        _priv->writer = newWriter;
 }
+#endif
 
 bool WriterAppender::requiresLayout() const
 {
@@ -308,6 +317,8 @@ bool WriterAppender::getImmediateFlush() const
        return _priv->immediateFlush;
 }
 
+#if LOG4CXX_ABI_VERSION <= 15
 const LOG4CXX_NS::helpers::WriterPtr WriterAppender::getWriter() const{
        return _priv->writer;
 }
+#endif
diff --git a/src/main/cpp/xmlsocketappender.cpp 
b/src/main/cpp/xmlsocketappender.cpp
index f097ebd4..df4bd4e5 100644
--- a/src/main/cpp/xmlsocketappender.cpp
+++ b/src/main/cpp/xmlsocketappender.cpp
@@ -46,6 +46,8 @@ struct XMLSocketAppender::XMLSocketAppenderPriv : public 
SocketAppenderSkeletonP
                SocketAppenderSkeletonPriv( host, port, delay ) {}
 
        LOG4CXX_NS::helpers::WriterPtr writer;
+
+       void close() override;
 };
 
 IMPLEMENT_LOG4CXX_OBJECT(XMLSocketAppender)
@@ -84,7 +86,8 @@ XMLSocketAppender::XMLSocketAppender(const LogString& host, 
int port1)
 
 XMLSocketAppender::~XMLSocketAppender()
 {
-       finalize();
+       if (_priv->setClosed())
+               _priv->close();
 }
 
 
@@ -106,14 +109,22 @@ void 
XMLSocketAppender::setSocket(LOG4CXX_NS::helpers::SocketPtr& socket, Pool&
        _priv->writer = std::make_shared<OutputStreamWriter>(os, charset);
 }
 
+#if LOG4CXX_ABI_VERSION <= 15
 void XMLSocketAppender::cleanUp(Pool& p)
 {
-       if (_priv->writer)
+       _priv->close();
+}
+#endif
+
+void XMLSocketAppender::XMLSocketAppenderPriv::close()
+{
+       SocketAppenderSkeletonPriv::close();
+       if (this->writer)
        {
                try
                {
-                       _priv->writer->close(p);
-                       _priv->writer = nullptr;
+                       this->writer->close(this->pool);
+                       this->writer = nullptr;
                }
                catch (std::exception&)
                {
diff --git a/src/main/include/log4cxx/appenderskeleton.h 
b/src/main/include/log4cxx/appenderskeleton.h
index 30260371..5bc1a7db 100644
--- a/src/main/include/log4cxx/appenderskeleton.h
+++ b/src/main/include/log4cxx/appenderskeleton.h
@@ -74,12 +74,14 @@ class LOG4CXX_EXPORT AppenderSkeleton :
                AppenderSkeleton(const LayoutPtr& layout);
                virtual ~AppenderSkeleton();
 
+#if LOG4CXX_ABI_VERSION <= 15
                /**
                Finalize this appender by calling the derived class'
                <code>close</code> method.
                */
+               [[ deprecated( "The derived appender destructor needs to 
implement its cleanup" ) ]]
                void finalize();
-
+#endif
                /**
                \copybrief spi::OptionHandler::activateOptions()
 
diff --git a/src/main/include/log4cxx/net/socketappenderskeleton.h 
b/src/main/include/log4cxx/net/socketappenderskeleton.h
index ea45b0ab..5608d24b 100644
--- a/src/main/include/log4cxx/net/socketappenderskeleton.h
+++ b/src/main/include/log4cxx/net/socketappenderskeleton.h
@@ -146,8 +146,9 @@ class LOG4CXX_EXPORT SocketAppenderSkeleton : public 
AppenderSkeleton
 
                virtual void setSocket(LOG4CXX_NS::helpers::SocketPtr& socket, 
LOG4CXX_NS::helpers::Pool& p) = 0;
 
+#if LOG4CXX_ABI_VERSION <= 15
                virtual void cleanUp(LOG4CXX_NS::helpers::Pool& p) = 0;
-
+#endif
                virtual int getDefaultDelay() const = 0;
 
                virtual int getDefaultPort() const = 0;
diff --git a/src/main/include/log4cxx/net/xmlsocketappender.h 
b/src/main/include/log4cxx/net/xmlsocketappender.h
index 44dd01db..0c9d8379 100644
--- a/src/main/include/log4cxx/net/xmlsocketappender.h
+++ b/src/main/include/log4cxx/net/xmlsocketappender.h
@@ -137,8 +137,9 @@ class LOG4CXX_EXPORT XMLSocketAppender : public 
SocketAppenderSkeleton
        protected:
                void setSocket(LOG4CXX_NS::helpers::SocketPtr& socket, 
helpers::Pool& p) override;
 
+#if LOG4CXX_ABI_VERSION <= 15
                void cleanUp(helpers::Pool& p) override;
-
+#endif
                int getDefaultDelay() const override;
 
                int getDefaultPort() const override;
diff --git a/src/main/include/log4cxx/private/odbcappender_priv.h 
b/src/main/include/log4cxx/private/odbcappender_priv.h
index d300e645..f46c614b 100644
--- a/src/main/include/log4cxx/private/odbcappender_priv.h
+++ b/src/main/include/log4cxx/private/odbcappender_priv.h
@@ -135,6 +135,9 @@ struct ODBCAppender::ODBCAppenderPriv : public 
AppenderSkeleton::AppenderSkeleto
 #if LOG4CXX_EVENTS_AT_EXIT
        helpers::AtExitRegistry::Raii atExitRegistryRaii;
 #endif
+
+       void flushBuffer(helpers::Pool& p);
+       void close();
 };
 
 }
diff --git a/src/main/include/log4cxx/private/socketappenderskeleton_priv.h 
b/src/main/include/log4cxx/private/socketappenderskeleton_priv.h
index e4a3537d..4e31bb29 100644
--- a/src/main/include/log4cxx/private/socketappenderskeleton_priv.h
+++ b/src/main/include/log4cxx/private/socketappenderskeleton_priv.h
@@ -56,8 +56,9 @@ struct SocketAppenderSkeleton::SocketAppenderSkeletonPriv : 
public AppenderSkele
                locationInfo(false)
        { }
 
-       ~SocketAppenderSkeletonPriv()
-        { stopMonitor(); }
+       virtual ~SocketAppenderSkeletonPriv()
+       {
+       }
 
        /**
        host name
@@ -72,7 +73,7 @@ struct SocketAppenderSkeleton::SocketAppenderSkeletonPriv : 
public AppenderSkele
        int port;
        int reconnectionDelay;
        bool locationInfo;
-       void stopMonitor();
+       virtual void close();
 
        /**
        Manages asynchronous reconnection attempts.
diff --git a/src/main/include/log4cxx/private/writerappender_priv.h 
b/src/main/include/log4cxx/private/writerappender_priv.h
index c9484299..63102140 100644
--- a/src/main/include/log4cxx/private/writerappender_priv.h
+++ b/src/main/include/log4cxx/private/writerappender_priv.h
@@ -89,6 +89,16 @@ struct WriterAppender::WriterAppenderPriv : public 
AppenderSkeleton::AppenderSke
 
        bool warnedNoWriter = false;
        bool checkWriter();
+
+       void close();
+       void writeHeader();
+       void writeFooter();
+
+       void setWriter(const helpers::WriterPtr& newWriter)
+       {
+               std::lock_guard<std::recursive_mutex> lock(this->mutex);
+               this->writer = newWriter;
+       }
 };
 
 }
diff --git a/src/main/include/log4cxx/writerappender.h 
b/src/main/include/log4cxx/writerappender.h
index c4645096..2eacda72 100644
--- a/src/main/include/log4cxx/writerappender.h
+++ b/src/main/include/log4cxx/writerappender.h
@@ -115,10 +115,12 @@ class LOG4CXX_EXPORT WriterAppender : public 
AppenderSkeleton
                void close() override;
 
        protected:
+#if LOG4CXX_ABI_VERSION <= 15
                /**
                 * Close the underlying {@link log4cxx::helpers::Writer}.
                 * */
                void closeWriter();
+#endif
 
                /**
                    Returns an OutputStreamWriter when passed an OutputStream.  
The
@@ -153,6 +155,7 @@ class LOG4CXX_EXPORT WriterAppender : public 
AppenderSkeleton
                 */
                void setOption(const LogString& option, const LogString& value) 
override;
 
+#if LOG4CXX_ABI_VERSION <= 15
                /**
                  <p>Send log output to \c writer which must be open and be 
writable.
 
@@ -166,6 +169,7 @@ class LOG4CXX_EXPORT WriterAppender : public 
AppenderSkeleton
                void setWriter(const helpers::WriterPtr& writer);
 
                const helpers::WriterPtr getWriter() const;
+#endif
 
                bool requiresLayout() const override;
 
@@ -176,6 +180,7 @@ class LOG4CXX_EXPORT WriterAppender : public 
AppenderSkeleton
                virtual void subAppend(const spi::LoggingEventPtr& event, 
helpers::Pool& p);
 
 
+#if LOG4CXX_ABI_VERSION <= 15
                /**
                Write a footer as produced by the embedded layout's
                Layout#appendFooter method.  */
@@ -190,7 +195,7 @@ class LOG4CXX_EXPORT WriterAppender : public 
AppenderSkeleton
                 * Set the writer.  Mutex must already be held.
                 */
                void setWriterInternal(const helpers::WriterPtr& writer);
-
+#endif
        private:
                //
                //  prevent copy and assignment

Reply via email to