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

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

commit f4efd85deeafed466f8cbecdcc913e37facde146
Author: Robert Middleton <[email protected]>
AuthorDate: Sun Oct 16 12:29:35 2022 -0400

    Broke out the multiprocess part of the rollingfileappender into a separate 
class
---
 src/main/cpp/CMakeLists.txt                        |   1 +
 src/main/cpp/fileoutputstream.cpp                  |   4 +
 ...der.cpp => multiprocessrollingfileappender.cpp} | 120 ++++++------
 src/main/cpp/outputstream.cpp                      |  12 --
 src/main/cpp/outputstreamwriter.cpp                |   3 +-
 src/main/cpp/rollingfileappender.cpp               | 201 --------------------
 src/main/cpp/rollingpolicybase.cpp                 |   5 +-
 src/main/cpp/timebasedrollingpolicy.cpp            | 206 +++++++++++----------
 src/main/cpp/writer.cpp                            |   8 +-
 src/main/cpp/writerappender.cpp                    |   4 +
 .../include/log4cxx/helpers/fileoutputstream.h     |   8 +-
 src/main/include/log4cxx/helpers/outputstream.h    |   7 -
 .../include/log4cxx/helpers/outputstreamwriter.h   |   2 +-
 src/main/include/log4cxx/helpers/writer.h          |   3 -
 ...keleton.h => multiprocessrollingfileappender.h} |  68 +++----
 .../include/log4cxx/rolling/rollingfileappender.h  |  22 ---
 .../include/log4cxx/rolling/rollingpolicybase.h    |  10 +-
 .../log4cxx/rolling/timebasedrollingpolicy.h       |  67 +++----
 src/main/include/log4cxx/writerappender.h          |   8 +-
 19 files changed, 242 insertions(+), 517 deletions(-)

diff --git a/src/main/cpp/CMakeLists.txt b/src/main/cpp/CMakeLists.txt
index 62080106..8837f1da 100644
--- a/src/main/cpp/CMakeLists.txt
+++ b/src/main/cpp/CMakeLists.txt
@@ -128,6 +128,7 @@ target_sources(log4cxx
   messagebuffer.cpp
   messagepatternconverter.cpp
   methodlocationpatternconverter.cpp
+  multiprocessrollingfileappender.cpp
   nameabbreviator.cpp
   namepatternconverter.cpp
   ndc.cpp
diff --git a/src/main/cpp/fileoutputstream.cpp 
b/src/main/cpp/fileoutputstream.cpp
index a55e6adc..dcfe8384 100644
--- a/src/main/cpp/fileoutputstream.cpp
+++ b/src/main/cpp/fileoutputstream.cpp
@@ -133,3 +133,7 @@ void FileOutputStream::write(ByteBuffer& buf, Pool& /* p */ 
)
        }
 }
 
+apr_file_t* FileOutputStream::getFilePtr() const{
+       return m_priv->fileptr;
+}
+
diff --git a/src/main/cpp/rollingfileappender.cpp 
b/src/main/cpp/multiprocessrollingfileappender.cpp
similarity index 83%
copy from src/main/cpp/rollingfileappender.cpp
copy to src/main/cpp/multiprocessrollingfileappender.cpp
index 03205071..5185ab67 100644
--- a/src/main/cpp/rollingfileappender.cpp
+++ b/src/main/cpp/multiprocessrollingfileappender.cpp
@@ -19,20 +19,19 @@
        #pragma warning ( disable: 4231 4251 4275 4786 )
 #endif
 
-#ifdef LOG4CXX_MULTI_PROCESS
-       #include <apr_portable.h>
-       #include <libgen.h>
-       #include <apr_file_io.h>
-       #include <apr_atomic.h>
-       #include <apr_mmap.h>
-       #ifndef MAX_FILE_LEN
-               #define MAX_FILE_LEN 2048
-       #endif
-       #include <log4cxx/pattern/filedatepatternconverter.h>
-       #include <log4cxx/helpers/date.h>
+
+#include <apr_portable.h>
+#include <libgen.h>
+#include <apr_file_io.h>
+#include <apr_atomic.h>
+#include <apr_mmap.h>
+#ifndef MAX_FILE_LEN
+       #define MAX_FILE_LEN 2048
 #endif
+#include <log4cxx/pattern/filedatepatternconverter.h>
+#include <log4cxx/helpers/date.h>
 
-#include <log4cxx/rolling/rollingfileappender.h>
+#include <log4cxx/rolling/multiprocessrollingfileappender.h>
 #include <log4cxx/helpers/loglog.h>
 #include <log4cxx/rolling/rolloverdescription.h>
 #include <log4cxx/helpers/fileoutputstream.h>
@@ -48,9 +47,9 @@ using namespace log4cxx::rolling;
 using namespace log4cxx::helpers;
 using namespace log4cxx::spi;
 
-struct RollingFileAppender::RollingFileAppenderPriv : public FileAppenderPriv
+struct MultiprocessRollingFileAppender::MultiprocessRollingFileAppenderPriv : 
public FileAppenderPriv
 {
-       RollingFileAppenderPriv() :
+       MultiprocessRollingFileAppenderPriv() :
                FileAppenderPriv(),
                fileLength(0) {}
 
@@ -75,23 +74,23 @@ struct RollingFileAppender::RollingFileAppenderPriv : 
public FileAppenderPriv
        spi::LoggingEventPtr _event;
 };
 
-#define _priv static_cast<RollingFileAppenderPriv*>(m_priv.get())
+#define _priv static_cast<MultiprocessRollingFileAppenderPriv*>(m_priv.get())
 
-IMPLEMENT_LOG4CXX_OBJECT(RollingFileAppender)
+IMPLEMENT_LOG4CXX_OBJECT(MultiprocessRollingFileAppender)
 
 
 /**
  * Construct a new instance.
  */
-RollingFileAppender::RollingFileAppender() :
-       FileAppender (std::make_unique<RollingFileAppenderPriv>())
+MultiprocessRollingFileAppender::MultiprocessRollingFileAppender() :
+       FileAppender (std::make_unique<MultiprocessRollingFileAppenderPriv>())
 {
 }
 
 /**
  * Prepare instance of use.
  */
-void RollingFileAppender::activateOptions(Pool& p)
+void MultiprocessRollingFileAppender::activateOptions(Pool& p)
 {
        if (_priv->rollingPolicy == NULL)
        {
@@ -174,8 +173,7 @@ void RollingFileAppender::activateOptions(Pool& p)
        }
 }
 
-#ifdef LOG4CXX_MULTI_PROCESS
-void RollingFileAppenderSkeleton::releaseFileLock(apr_file_t* lock_file)
+void MultiprocessRollingFileAppender::releaseFileLock(apr_file_t* lock_file)
 {
        if (lock_file)
        {
@@ -190,7 +188,7 @@ void 
RollingFileAppenderSkeleton::releaseFileLock(apr_file_t* lock_file)
                lock_file = NULL;
        }
 }
-#endif
+
 /**
    Implements the usual roll over behaviour.
 
@@ -206,13 +204,13 @@ void 
RollingFileAppenderSkeleton::releaseFileLock(apr_file_t* lock_file)
 
  * @return true if rollover performed.
  */
-bool RollingFileAppender::rollover(Pool& p)
+bool MultiprocessRollingFileAppender::rollover(Pool& p)
 {
        std::lock_guard<std::recursive_mutex> lock(_priv->mutex);
        return rolloverInternal(p);
 }
 
-bool RollingFileAppender::rolloverInternal(Pool& p)
+bool MultiprocessRollingFileAppender::rolloverInternal(Pool& p)
 {
        //
        //   can't roll without a policy
@@ -221,10 +219,8 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
        {
 
                {
-
-#ifdef LOG4CXX_MULTI_PROCESS
                        std::string fileName(getFile());
-                       RollingPolicyBase* basePolicy = 
dynamic_cast<RollingPolicyBase* >(&(*rollingPolicy));
+                       RollingPolicyBasePtr basePolicy = 
log4cxx::cast<RollingPolicyBase>(_priv->rollingPolicy);
                        apr_time_t n = apr_time_now();
                        ObjectPtr obj = std::make_shared<Date>(n);
                        LogString fileNamePattern;
@@ -246,7 +242,7 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
                        memcpy(szBaseName, fileName.c_str(), fileName.size() > 
MAX_FILE_LEN ? MAX_FILE_LEN : fileName.size());
                        apr_uid_t uid;
                        apr_gid_t groupid;
-                       apr_status_t stat = apr_uid_current(&uid, &groupid, 
pool.getAPRPool());
+                       apr_status_t stat = apr_uid_current(&uid, &groupid, 
p.getAPRPool());
 
                        if (stat == APR_SUCCESS)
                        {
@@ -278,9 +274,9 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
                                }
                                else
                                {
-                                       if (_event)
+                                       if (_priv->_event)
                                        {
-                                               
triggeringPolicy->isTriggeringEvent(this, *_event, getFile(), getFileLength());
+                                               
_priv->triggeringPolicy->isTriggeringEvent(this, _priv->_event, getFile(), 
getFileLength());
                                        }
                                }
                        }
@@ -289,7 +285,13 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
                        {
                                apr_finfo_t finfo1, finfo2;
                                apr_status_t st1, st2;
-                               apr_file_t* _fd = 
getWriter()->getOutPutStreamPtr()->getFileOutPutStreamPtr().getFilePtr();
+                               const WriterPtr writer = getWriter();
+                               const FileOutputStreamPtr fos = 
log4cxx::cast<FileOutputStream>( writer );
+                               if( !fos ){
+                                       LogLog::error( "Can't cast writer to 
FileOutputStream" );
+                                       return false;
+                               }
+                               apr_file_t* _fd = fos->getFilePtr();
                                st1 = apr_file_info_get(&finfo1, 
APR_FINFO_IDENT, _fd);
 
                                if (st1 != APR_SUCCESS)
@@ -310,7 +312,6 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 
                        if (!bAlreadyRolled)
                        {
-#endif
 
                                try
                                {
@@ -427,9 +428,7 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
                                                        writeHeader(p);
                                                }
 
-#ifdef LOG4CXX_MULTI_PROCESS
                                                releaseFileLock(lock_file);
-#endif
                                                return true;
                                        }
                                }
@@ -441,7 +440,6 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
                                        _priv->errorHandler->error(exmsg, ex, 
0);
                                }
 
-#ifdef LOG4CXX_MULTI_PROCESS
                        }
                        else
                        {
@@ -449,34 +447,31 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
                        }
 
                        releaseFileLock(lock_file);
-#endif
                }
        }
 
        return false;
 }
 
-#ifdef LOG4CXX_MULTI_PROCESS
 /**
  * re-open current file when its own handler has been renamed
  */
-void RollingFileAppenderSkeleton::reopenLatestFile(Pool& p)
+void MultiprocessRollingFileAppender::reopenLatestFile(Pool& p)
 {
        closeWriter();
-       OutputStreamPtr os = std::make_shared<FileOutputStream(getFile>(), 
true);
+       OutputStreamPtr os = std::make_shared<FileOutputStream>(getFile(), 
true);
        WriterPtr newWriter(createWriter(os));
        setFile(getFile());
        setWriter(newWriter);
-       fileLength = File().setPath(getFile()).length(p);
+       _priv->fileLength = File().setPath(getFile()).length(p);
        writeHeader(p);
 }
 
-#endif
 
 /**
  * {@inheritDoc}
 */
-void RollingFileAppender::subAppend(const LoggingEventPtr& event, Pool& p)
+void MultiprocessRollingFileAppender::subAppend(const LoggingEventPtr& event, 
Pool& p)
 {
        // The rollover check must precede actual writing. This is the
        // only correct behavior for time driven triggers.
@@ -503,12 +498,17 @@ void RollingFileAppender::subAppend(const 
LoggingEventPtr& event, Pool& p)
                }
        }
 
-#ifdef LOG4CXX_MULTI_PROCESS
        //do re-check before every write
        //
        apr_finfo_t finfo1, finfo2;
        apr_status_t st1, st2;
-       apr_file_t* _fd = 
getWriter()->getOutPutStreamPtr()->getFileOutPutStreamPtr().getFilePtr();
+       const WriterPtr writer = getWriter();
+       const FileOutputStreamPtr fos = log4cxx::cast<FileOutputStream>( writer 
);
+       if( !fos ){
+               LogLog::error( "Can't cast writer to FileOutputStream" );
+               return;
+       }
+       apr_file_t* _fd = fos->getFilePtr();
        st1 = apr_file_info_get(&finfo1, APR_FINFO_IDENT, _fd);
 
        if (st1 != APR_SUCCESS)
@@ -532,8 +532,6 @@ void RollingFileAppender::subAppend(const LoggingEventPtr& 
event, Pool& p)
                reopenLatestFile(p);
        }
 
-#endif
-
        FileAppender::subAppend(event, p);
 }
 
@@ -541,7 +539,7 @@ void RollingFileAppender::subAppend(const LoggingEventPtr& 
event, Pool& p)
  * Get rolling policy.
  * @return rolling policy.
  */
-RollingPolicyPtr RollingFileAppender::getRollingPolicy() const
+RollingPolicyPtr MultiprocessRollingFileAppender::getRollingPolicy() const
 {
        return _priv->rollingPolicy;
 }
@@ -550,7 +548,7 @@ RollingPolicyPtr RollingFileAppender::getRollingPolicy() 
const
  * Get triggering policy.
  * @return triggering policy.
  */
-TriggeringPolicyPtr RollingFileAppender::getTriggeringPolicy() const
+TriggeringPolicyPtr MultiprocessRollingFileAppender::getTriggeringPolicy() 
const
 {
        return _priv->triggeringPolicy;
 }
@@ -559,7 +557,7 @@ TriggeringPolicyPtr 
RollingFileAppender::getTriggeringPolicy() const
  * Sets the rolling policy.
  * @param policy rolling policy.
  */
-void RollingFileAppender::setRollingPolicy(const RollingPolicyPtr& policy)
+void MultiprocessRollingFileAppender::setRollingPolicy(const RollingPolicyPtr& 
policy)
 {
        _priv->rollingPolicy = policy;
 }
@@ -568,7 +566,7 @@ void RollingFileAppender::setRollingPolicy(const 
RollingPolicyPtr& policy)
  * Set triggering policy.
  * @param policy triggering policy.
  */
-void RollingFileAppender::setTriggeringPolicy(const TriggeringPolicyPtr& 
policy)
+void MultiprocessRollingFileAppender::setTriggeringPolicy(const 
TriggeringPolicyPtr& policy)
 {
        _priv->triggeringPolicy = policy;
 }
@@ -576,7 +574,7 @@ void RollingFileAppender::setTriggeringPolicy(const 
TriggeringPolicyPtr& policy)
 /**
  * Close appender.  Waits for any asynchronous file compression actions to be 
completed.
  */
-void RollingFileAppender::close()
+void MultiprocessRollingFileAppender::close()
 {
        FileAppender::close();
 }
@@ -600,7 +598,7 @@ class CountingOutputStream : public OutputStream
                /**
                 * Rolling file appender to inform of stream writes.
                 */
-               RollingFileAppender* rfa;
+               MultiprocessRollingFileAppender* rfa;
 
        public:
                /**
@@ -609,7 +607,7 @@ class CountingOutputStream : public OutputStream
                 * @param rfa rolling file appender to inform.
                 */
                CountingOutputStream(
-                       OutputStreamPtr& os1, RollingFileAppender* rfa1) :
+                       OutputStreamPtr& os1, MultiprocessRollingFileAppender* 
rfa1) :
                        os(os1), rfa(rfa1)
                {
                }
@@ -640,20 +638,14 @@ class CountingOutputStream : public OutputStream
 
                        if (rfa != 0)
                        {
-#ifndef LOG4CXX_MULTI_PROCESS
-                               rfa->incrementFileLength(buf.limit());
-#else
                                
rfa->setFileLength(File().setPath(rfa->getFile()).length(p));
-#endif
                        }
                }
 
-#ifdef LOG4CXX_MULTI_PROCESS
                OutputStream& getFileOutPutStreamPtr()
                {
                        return *os;
                }
-#endif
 };
 }
 }
@@ -667,7 +659,7 @@ class CountingOutputStream : public OutputStream
  @param os output stream, may not be null.
  @return new writer.
  */
-WriterPtr RollingFileAppender::createWriter(OutputStreamPtr& os)
+WriterPtr MultiprocessRollingFileAppender::createWriter(OutputStreamPtr& os)
 {
        OutputStreamPtr cos = std::make_shared<CountingOutputStream>(os, this);
        return FileAppender::createWriter(cos);
@@ -677,23 +669,21 @@ WriterPtr 
RollingFileAppender::createWriter(OutputStreamPtr& os)
  * Get byte length of current active log file.
  * @return byte length of current active log file.
  */
-size_t RollingFileAppender::getFileLength() const
+size_t MultiprocessRollingFileAppender::getFileLength() const
 {
        return _priv->fileLength;
 }
 
-#ifdef LOG4CXX_MULTI_PROCESS
-void RollingFileAppender::setFileLength(size_t length)
+void MultiprocessRollingFileAppender::setFileLength(size_t length)
 {
        _priv->fileLength = length;
 }
-#endif
 
 /**
  * Increments estimated byte length of current active log file.
  * @param increment additional bytes written to log file.
  */
-void RollingFileAppender::incrementFileLength(size_t increment)
+void MultiprocessRollingFileAppender::incrementFileLength(size_t increment)
 {
        _priv->fileLength += increment;
 }
diff --git a/src/main/cpp/outputstream.cpp b/src/main/cpp/outputstream.cpp
index 2175744d..169823cf 100644
--- a/src/main/cpp/outputstream.cpp
+++ b/src/main/cpp/outputstream.cpp
@@ -31,15 +31,3 @@ OutputStream::OutputStream()
 OutputStream::~OutputStream()
 {
 }
-
-#ifdef LOG4CXX_MULTI_PROCESS
-apr_file_t* OutputStream::getFilePtr()
-{
-       throw std::logic_error("getFilePtr must be implemented in the derived 
class that you are using");
-}
-
-OutputStream& OutputStream::getFileOutPutStreamPtr()
-{
-       throw std::logic_error("getFileOutPutStreamPtr must be implemented in 
the derived class that you are using");
-}
-#endif
diff --git a/src/main/cpp/outputstreamwriter.cpp 
b/src/main/cpp/outputstreamwriter.cpp
index 703f31f8..90d19931 100644
--- a/src/main/cpp/outputstreamwriter.cpp
+++ b/src/main/cpp/outputstreamwriter.cpp
@@ -81,6 +81,7 @@ void OutputStreamWriter::write(const LogString& str, Pool& p)
        if (str.length() > 0)
        {
 #ifdef LOG4CXX_MULTI_PROCESS
+               // Why does this need to happen for multiproces??  why??
                size_t bufSize = str.length() * 2;
                char* rawbuf = new char[bufSize];
                ByteBuffer buf(rawbuf, (size_t) bufSize);
@@ -110,7 +111,7 @@ void OutputStreamWriter::write(const LogString& str, Pool& 
p)
        }
 }
 
-OutputStreamPtr OutputStreamWriter::getOutPutStreamPtr() const
+OutputStreamPtr OutputStreamWriter::getOutputStreamPtr() const
 {
        return m_priv->out;
 }
diff --git a/src/main/cpp/rollingfileappender.cpp 
b/src/main/cpp/rollingfileappender.cpp
index 03205071..a24a8e49 100644
--- a/src/main/cpp/rollingfileappender.cpp
+++ b/src/main/cpp/rollingfileappender.cpp
@@ -19,19 +19,6 @@
        #pragma warning ( disable: 4231 4251 4275 4786 )
 #endif
 
-#ifdef LOG4CXX_MULTI_PROCESS
-       #include <apr_portable.h>
-       #include <libgen.h>
-       #include <apr_file_io.h>
-       #include <apr_atomic.h>
-       #include <apr_mmap.h>
-       #ifndef MAX_FILE_LEN
-               #define MAX_FILE_LEN 2048
-       #endif
-       #include <log4cxx/pattern/filedatepatternconverter.h>
-       #include <log4cxx/helpers/date.h>
-#endif
-
 #include <log4cxx/rolling/rollingfileappender.h>
 #include <log4cxx/helpers/loglog.h>
 #include <log4cxx/rolling/rolloverdescription.h>
@@ -174,23 +161,6 @@ void RollingFileAppender::activateOptions(Pool& p)
        }
 }
 
-#ifdef LOG4CXX_MULTI_PROCESS
-void RollingFileAppenderSkeleton::releaseFileLock(apr_file_t* lock_file)
-{
-       if (lock_file)
-       {
-               apr_status_t stat = apr_file_unlock(lock_file);
-
-               if (stat != APR_SUCCESS)
-               {
-                       LogLog::warn(LOG4CXX_STR("flock: unlock failed"));
-               }
-
-               apr_file_close(lock_file);
-               lock_file = NULL;
-       }
-}
-#endif
 /**
    Implements the usual roll over behaviour.
 
@@ -221,97 +191,6 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
        {
 
                {
-
-#ifdef LOG4CXX_MULTI_PROCESS
-                       std::string fileName(getFile());
-                       RollingPolicyBase* basePolicy = 
dynamic_cast<RollingPolicyBase* >(&(*rollingPolicy));
-                       apr_time_t n = apr_time_now();
-                       ObjectPtr obj = std::make_shared<Date>(n);
-                       LogString fileNamePattern;
-
-                       if (basePolicy)
-                       {
-                               if 
(basePolicy->getPatternConverterList().size())
-                               {
-                                       
(*(basePolicy->getPatternConverterList().begin()))->format(obj, 
fileNamePattern, p);
-                                       fileName = std::string(fileNamePattern);
-                               }
-                       }
-
-                       bool bAlreadyRolled = true;
-                       char szDirName[MAX_FILE_LEN] = {'\0'};
-                       char szBaseName[MAX_FILE_LEN] = {'\0'};
-                       char szUid[MAX_FILE_LEN] = {'\0'};
-                       memcpy(szDirName, fileName.c_str(), fileName.size() > 
MAX_FILE_LEN ? MAX_FILE_LEN : fileName.size());
-                       memcpy(szBaseName, fileName.c_str(), fileName.size() > 
MAX_FILE_LEN ? MAX_FILE_LEN : fileName.size());
-                       apr_uid_t uid;
-                       apr_gid_t groupid;
-                       apr_status_t stat = apr_uid_current(&uid, &groupid, 
pool.getAPRPool());
-
-                       if (stat == APR_SUCCESS)
-                       {
-                               snprintf(szUid, MAX_FILE_LEN, "%u", uid);
-                       }
-
-                       const std::string lockname = 
std::string(::dirname(szDirName)) + "/." + ::basename(szBaseName) + szUid + 
".lock";
-                       apr_file_t* lock_file;
-                       stat = apr_file_open(&lock_file, lockname.c_str(), 
APR_CREATE | APR_READ | APR_WRITE, APR_OS_DEFAULT, p.getAPRPool());
-
-                       if (stat != APR_SUCCESS)
-                       {
-                               std::string err = "lockfile return error: open 
lockfile failed. ";
-                               err += (strerror(errno));
-                               LogLog::warn(LOG4CXX_STR(err.c_str()));
-                               bAlreadyRolled = false;
-                               lock_file = NULL;
-                       }
-                       else
-                       {
-                               stat = apr_file_lock(lock_file, 
APR_FLOCK_EXCLUSIVE);
-
-                               if (stat != APR_SUCCESS)
-                               {
-                                       std::string err = "apr_file_lock: lock 
failed. ";
-                                       err += (strerror(errno));
-                                       LogLog::warn(LOG4CXX_STR(err.c_str()));
-                                       bAlreadyRolled = false;
-                               }
-                               else
-                               {
-                                       if (_event)
-                                       {
-                                               
triggeringPolicy->isTriggeringEvent(this, *_event, getFile(), getFileLength());
-                                       }
-                               }
-                       }
-
-                       if (bAlreadyRolled)
-                       {
-                               apr_finfo_t finfo1, finfo2;
-                               apr_status_t st1, st2;
-                               apr_file_t* _fd = 
getWriter()->getOutPutStreamPtr()->getFileOutPutStreamPtr().getFilePtr();
-                               st1 = apr_file_info_get(&finfo1, 
APR_FINFO_IDENT, _fd);
-
-                               if (st1 != APR_SUCCESS)
-                               {
-                                       
LogLog::warn(LOG4CXX_STR("apr_file_info_get failed"));
-                               }
-
-                               st2 = apr_stat(&finfo2, 
std::string(getFile()).c_str(), APR_FINFO_IDENT, p.getAPRPool());
-
-                               if (st2 != APR_SUCCESS)
-                               {
-                                       LogLog::warn(LOG4CXX_STR("apr_stat 
failed."));
-                               }
-
-                               bAlreadyRolled = ((st1 == APR_SUCCESS) && (st2 
== APR_SUCCESS)
-                                               && ((finfo1.device != 
finfo2.device) || (finfo1.inode != finfo2.inode)));
-                       }
-
-                       if (!bAlreadyRolled)
-                       {
-#endif
-
                                try
                                {
                                        RolloverDescriptionPtr 
rollover1(_priv->rollingPolicy->rollover(this->getFile(), this->getAppend(), 
p));
@@ -426,10 +305,6 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 
                                                        writeHeader(p);
                                                }
-
-#ifdef LOG4CXX_MULTI_PROCESS
-                                               releaseFileLock(lock_file);
-#endif
                                                return true;
                                        }
                                }
@@ -440,39 +315,12 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
                                        
log4cxx::helpers::Transcoder::decode(ex.what(), exmsg);
                                        _priv->errorHandler->error(exmsg, ex, 
0);
                                }
-
-#ifdef LOG4CXX_MULTI_PROCESS
-                       }
-                       else
-                       {
-                               reopenLatestFile(p);
-                       }
-
-                       releaseFileLock(lock_file);
-#endif
                }
        }
 
        return false;
 }
 
-#ifdef LOG4CXX_MULTI_PROCESS
-/**
- * re-open current file when its own handler has been renamed
- */
-void RollingFileAppenderSkeleton::reopenLatestFile(Pool& p)
-{
-       closeWriter();
-       OutputStreamPtr os = std::make_shared<FileOutputStream(getFile>(), 
true);
-       WriterPtr newWriter(createWriter(os));
-       setFile(getFile());
-       setWriter(newWriter);
-       fileLength = File().setPath(getFile()).length(p);
-       writeHeader(p);
-}
-
-#endif
-
 /**
  * {@inheritDoc}
 */
@@ -503,37 +351,6 @@ void RollingFileAppender::subAppend(const LoggingEventPtr& 
event, Pool& p)
                }
        }
 
-#ifdef LOG4CXX_MULTI_PROCESS
-       //do re-check before every write
-       //
-       apr_finfo_t finfo1, finfo2;
-       apr_status_t st1, st2;
-       apr_file_t* _fd = 
getWriter()->getOutPutStreamPtr()->getFileOutPutStreamPtr().getFilePtr();
-       st1 = apr_file_info_get(&finfo1, APR_FINFO_IDENT, _fd);
-
-       if (st1 != APR_SUCCESS)
-       {
-               LogLog::warn(LOG4CXX_STR("apr_file_info_get failed"));
-       }
-
-       st2 = apr_stat(&finfo2, std::string(getFile()).c_str(), 
APR_FINFO_IDENT, p.getAPRPool());
-
-       if (st2 != APR_SUCCESS)
-       {
-               std::string err = "apr_stat failed. file:" + 
std::string(getFile());
-               LogLog::warn(LOG4CXX_STR(err.c_str()));
-       }
-
-       bool bAlreadyRolled = ((st1 == APR_SUCCESS) && (st2 == APR_SUCCESS)
-                       && ((finfo1.device != finfo2.device) || (finfo1.inode 
!= finfo2.inode)));
-
-       if (bAlreadyRolled)
-       {
-               reopenLatestFile(p);
-       }
-
-#endif
-
        FileAppender::subAppend(event, p);
 }
 
@@ -640,20 +457,9 @@ class CountingOutputStream : public OutputStream
 
                        if (rfa != 0)
                        {
-#ifndef LOG4CXX_MULTI_PROCESS
                                rfa->incrementFileLength(buf.limit());
-#else
-                               
rfa->setFileLength(File().setPath(rfa->getFile()).length(p));
-#endif
                        }
                }
-
-#ifdef LOG4CXX_MULTI_PROCESS
-               OutputStream& getFileOutPutStreamPtr()
-               {
-                       return *os;
-               }
-#endif
 };
 }
 }
@@ -682,13 +488,6 @@ size_t RollingFileAppender::getFileLength() const
        return _priv->fileLength;
 }
 
-#ifdef LOG4CXX_MULTI_PROCESS
-void RollingFileAppender::setFileLength(size_t length)
-{
-       _priv->fileLength = length;
-}
-#endif
-
 /**
  * Increments estimated byte length of current active log file.
  * @param increment additional bytes written to log file.
diff --git a/src/main/cpp/rollingpolicybase.cpp 
b/src/main/cpp/rollingpolicybase.cpp
index 3e409dfd..c22a36a4 100644
--- a/src/main/cpp/rollingpolicybase.cpp
+++ b/src/main/cpp/rollingpolicybase.cpp
@@ -183,4 +183,7 @@ void 
RollingPolicyBase::setCreateIntermediateDirectories(bool createIntermediate
        m_priv->createIntermediateDirectories = createIntermediate;
 }
 
-
+PatternConverterList RollingPolicyBase::getPatternConverterList() const
+{
+       return m_priv->patternConverters;
+}
diff --git a/src/main/cpp/timebasedrollingpolicy.cpp 
b/src/main/cpp/timebasedrollingpolicy.cpp
index eadf2b0c..cf32329d 100644
--- a/src/main/cpp/timebasedrollingpolicy.cpp
+++ b/src/main/cpp/timebasedrollingpolicy.cpp
@@ -18,10 +18,6 @@
        #pragma warning ( disable: 4231 4251 4275 4786 )
 #endif
 
-#ifdef LOG4CXX_MULTI_PROCESS
-       #include <libgen.h>
-#endif
-
 #include <log4cxx/logstring.h>
 #include <log4cxx/rolling/timebasedrollingpolicy.h>
 #include <log4cxx/pattern/filedatepatternconverter.h>
@@ -31,7 +27,11 @@
 #include <log4cxx/helpers/exception.h>
 #include <log4cxx/rolling/gzcompressaction.h>
 #include <log4cxx/rolling/zipcompressaction.h>
-#include<iostream>
+#include <log4cxx/helpers/stringhelper.h>
+#include <log4cxx/helpers/optionconverter.h>
+#include <log4cxx/fileappender.h>
+#include <iostream>
+#include <libgen.h>
 
 using namespace log4cxx;
 using namespace log4cxx::rolling;
@@ -41,6 +41,13 @@ using namespace log4cxx::pattern;
 IMPLEMENT_LOG4CXX_OBJECT(TimeBasedRollingPolicy)
 
 struct TimeBasedRollingPolicy::TimeBasedRollingPolicyPrivate{
+       TimeBasedRollingPolicyPrivate() :
+               _mmap(nullptr),
+               _file_map(nullptr),
+               _lock_file(nullptr),
+               bAlreadyInitialized(false),
+               bRefreshCurFile(false){}
+
                /**
                 * Time for next determination if time for rollover.
                 */
@@ -59,7 +66,7 @@ struct TimeBasedRollingPolicy::TimeBasedRollingPolicyPrivate{
                /*
                 * pool for mmap handler
                 * */
-               log4cxx::helpers::Pool* _mmapPool;
+               log4cxx::helpers::Pool _mmapPool;
 
                /**
                 * mmap file descriptor
@@ -100,9 +107,11 @@ struct 
TimeBasedRollingPolicy::TimeBasedRollingPolicyPrivate{
                 * Length of any file type suffix (.gz, .zip).
                 */
                int suffixLength;
+
+               bool multiprocess = false;
 };
 
-#ifdef LOG4CXX_MULTI_PROCESS
+
 #define MMAP_FILE_SUFFIX ".map"
 #define LOCK_FILE_SUFFIX ".maplck"
 #define MAX_FILE_LEN 2048
@@ -110,7 +119,7 @@ struct 
TimeBasedRollingPolicy::TimeBasedRollingPolicyPrivate{
 bool TimeBasedRollingPolicy::isMapFileEmpty(log4cxx::helpers::Pool& pool)
 {
        apr_finfo_t finfo;
-       apr_status_t st = apr_stat(&finfo, _mapFileName.c_str(), 
APR_FINFO_SIZE, pool.getAPRPool());
+       apr_status_t st = apr_stat(&finfo, m_priv->_mapFileName.c_str(), 
APR_FINFO_SIZE, pool.getAPRPool());
 
        if (st != APR_SUCCESS)
        {
@@ -129,16 +138,16 @@ void TimeBasedRollingPolicy::initMMapFile(const 
LogString& lastFileName, log4cxx
 {
        int iRet = 0;
 
-       if (!_mmap)
+       if (!m_priv->_mmap)
        {
-               iRet = createMMapFile(std::string(_fileNamePattern), pool);
+               iRet = createMMapFile(std::string(m_priv->_fileNamePattern), 
pool);
        }
 
        if (!iRet && isMapFileEmpty(pool))
        {
                lockMMapFile(APR_FLOCK_EXCLUSIVE);
-               memset(_mmap->mm, 0, MAX_FILE_LEN);
-               memcpy(_mmap->mm, std::string(lastFileName).c_str(), 
std::string(lastFileName).size());
+               memset(m_priv->_mmap->mm, 0, MAX_FILE_LEN);
+               memcpy(m_priv->_mmap->mm, std::string(lastFileName).c_str(), 
std::string(lastFileName).size());
                unLockMMapFile();
        }
 }
@@ -160,40 +169,41 @@ const std::string 
TimeBasedRollingPolicy::createFile(const std::string& fileName
                snprintf(szUid, MAX_FILE_LEN, "%u", uid);
        }
 
+       // TODO this should probably be using boost::filesystem or 
std::filesystem
        return std::string(::dirname(szDirName)) + "/." + 
::basename(szBaseName) + szUid + suffix;
 }
 
 int TimeBasedRollingPolicy::createMMapFile(const std::string& fileName, 
log4cxx::helpers::Pool& pool)
 {
-       _mapFileName = createFile(fileName, MMAP_FILE_SUFFIX, pool);
+       m_priv->_mapFileName = createFile(fileName, MMAP_FILE_SUFFIX, pool);
 
-       apr_status_t stat = apr_file_open(&_file_map, _mapFileName.c_str(), 
APR_CREATE | APR_READ | APR_WRITE, APR_OS_DEFAULT, _mmapPool->getAPRPool());
+       apr_status_t stat = apr_file_open(&m_priv->_file_map, 
m_priv->_mapFileName.c_str(), APR_CREATE | APR_READ | APR_WRITE, 
APR_OS_DEFAULT, m_priv->_mmapPool.getAPRPool());
 
        if (stat != APR_SUCCESS)
        {
-               std::string err(std::string("open mmap file failed. ") + 
std::string(strerror(errno)) + ". Check the privilege or try to remove " + 
_mapFileName + " if exist.");
+               std::string err(std::string("open mmap file failed. ") + 
std::string(strerror(errno)) + ". Check the privilege or try to remove " + 
m_priv->_mapFileName + " if exist.");
                LogLog::warn(LOG4CXX_STR(err.c_str()));
                return -1;
        }
 
        if (isMapFileEmpty(pool))
        {
-               stat = apr_file_trunc(_file_map, MAX_FILE_LEN + 1);
+               stat = apr_file_trunc(m_priv->_file_map, MAX_FILE_LEN + 1);
 
                if (stat != APR_SUCCESS)
                {
                        LogLog::warn(LOG4CXX_STR("apr_file_trunc failed."));
-                       apr_file_close(_file_map);
+                       apr_file_close(m_priv->_file_map);
                        return -1;
                }
        }
 
-       stat = apr_mmap_create(&_mmap, _file_map, 0, MAX_FILE_LEN, 
APR_MMAP_WRITE | APR_MMAP_READ, _mmapPool->getAPRPool());
+       stat = apr_mmap_create(&m_priv->_mmap, m_priv->_file_map, 0, 
MAX_FILE_LEN, APR_MMAP_WRITE | APR_MMAP_READ, m_priv->_mmapPool.getAPRPool());
 
        if (stat != APR_SUCCESS)
        {
                LogLog::warn(LOG4CXX_STR("mmap failed."));
-               apr_file_close(_file_map);
+               apr_file_close(m_priv->_file_map);
                return -1;
        }
 
@@ -202,7 +212,7 @@ int TimeBasedRollingPolicy::createMMapFile(const 
std::string& fileName, log4cxx:
 
 int TimeBasedRollingPolicy::lockMMapFile(int type)
 {
-       apr_status_t stat = apr_file_lock(_lock_file, type);
+       apr_status_t stat = apr_file_lock(m_priv->_lock_file, type);
 
        if (stat != APR_SUCCESS)
        {
@@ -211,7 +221,7 @@ int TimeBasedRollingPolicy::lockMMapFile(int type)
 }
 int TimeBasedRollingPolicy::unLockMMapFile()
 {
-       apr_status_t stat = apr_file_unlock(_lock_file);
+       apr_status_t stat = apr_file_unlock(m_priv->_lock_file);
 
        if (stat != APR_SUCCESS)
        {
@@ -219,26 +229,13 @@ int TimeBasedRollingPolicy::unLockMMapFile()
        }
 }
 
-#endif
-
 TimeBasedRollingPolicy::TimeBasedRollingPolicy() :
        m_priv(std::make_unique<TimeBasedRollingPolicyPrivate>())
-#ifdef LOG4CXX_MULTI_PROCESS
-       : _mmap(NULL), _file_map(NULL), bAlreadyInitialized(false), 
_mmapPool(new Pool()), _lock_file(NULL), bRefreshCurFile(false)
-#endif
 {
 }
 
 TimeBasedRollingPolicy::~TimeBasedRollingPolicy(){}
 
-#ifdef LOG4CXX_MULTI_PROCESS
-TimeBasedRollingPolicy::~TimeBasedRollingPolicy()
-{
-       //no-need to delete mmap
-       delete _mmapPool;
-}
-#endif
-
 void TimeBasedRollingPolicy::activateOptions(log4cxx::helpers::Pool& pool)
 {
        // find out period from the filename pattern
@@ -265,30 +262,29 @@ void 
TimeBasedRollingPolicy::activateOptions(log4cxx::helpers::Pool& pool)
        formatFileName(obj, buf, pool);
        m_priv->lastFileName = buf;
 
-#ifdef LOG4CXX_MULTI_PROCESS
-
-       if (getPatternConverterList().size())
-       {
-               (*(getPatternConverterList().begin()))->format(obj, 
_fileNamePattern, pool);
-       }
-       else
-       {
-               _fileNamePattern = lastFileName;
-       }
-
-       if (!_lock_file)
-       {
-               const std::string lockname = 
createFile(std::string(_fileNamePattern), LOCK_FILE_SUFFIX, *_mmapPool);
-               apr_status_t stat = apr_file_open(&_lock_file, 
lockname.c_str(), APR_CREATE | APR_READ | APR_WRITE, APR_OS_DEFAULT, 
(*_mmapPool).getAPRPool());
+       if( m_priv->multiprocess ){
+               if (getPatternConverterList().size())
+               {
+                       (*(getPatternConverterList().begin()))->format(obj, 
m_priv->_fileNamePattern, pool);
+               }
+               else
+               {
+                       m_priv->_fileNamePattern = m_priv->lastFileName;
+               }
 
-               if (stat != APR_SUCCESS)
+               if (!m_priv->_lock_file)
                {
-                       LogLog::warn(LOG4CXX_STR("open lock file failed."));
+                       const std::string lockname = 
createFile(std::string(m_priv->_fileNamePattern), LOCK_FILE_SUFFIX, 
m_priv->_mmapPool);
+                       apr_status_t stat = apr_file_open(&m_priv->_lock_file, 
lockname.c_str(), APR_CREATE | APR_READ | APR_WRITE, APR_OS_DEFAULT, 
m_priv->_mmapPool.getAPRPool());
+
+                       if (stat != APR_SUCCESS)
+                       {
+                               LogLog::warn(LOG4CXX_STR("open lock file 
failed."));
+                       }
                }
-       }
 
-       initMMapFile(lastFileName, *_mmapPool);
-#endif
+               initMMapFile(m_priv->lastFileName, m_priv->_mmapPool);
+       }
 
        m_priv->suffixLength = 0;
 
@@ -367,24 +363,23 @@ RolloverDescriptionPtr TimeBasedRollingPolicy::rollover(
 
        LogString newFileName(buf);
 
-#ifdef LOG4CXX_MULTI_PROCESS
-       bAlreadyInitialized = true;
+       if( m_priv->multiprocess ){
+               m_priv->bAlreadyInitialized = true;
 
-       if (_mmap && !isMapFileEmpty(*_mmapPool))
-       {
-               lockMMapFile(APR_FLOCK_SHARED);
-               LogString mapLastFile((char*)_mmap->mm);
-               lastFileName = mapLastFile;
-               unLockMMapFile();
-       }
-       else
-       {
-               _mmap = NULL;
-               initMMapFile(lastFileName, *_mmapPool);
+               if (m_priv->_mmap && !isMapFileEmpty(m_priv->_mmapPool))
+               {
+                       lockMMapFile(APR_FLOCK_SHARED);
+                       LogString mapLastFile((char*)m_priv->_mmap->mm);
+                       m_priv->lastFileName = mapLastFile;
+                       unLockMMapFile();
+               }
+               else
+               {
+                       m_priv->_mmap = NULL;
+                       initMMapFile(m_priv->lastFileName, m_priv->_mmapPool);
+               }
        }
 
-#endif
-
        //
        //  if file names haven't changed, no rollover
        //
@@ -430,25 +425,23 @@ RolloverDescriptionPtr TimeBasedRollingPolicy::rollover(
                                        File().setPath(lastBaseName), 
File().setPath(m_priv->lastFileName), true);
        }
 
-#ifdef LOG4CXX_MULTI_PROCESS
-
-       if (_mmap && !isMapFileEmpty(*_mmapPool))
-       {
-               lockMMapFile(APR_FLOCK_EXCLUSIVE);
-               memset(_mmap->mm, 0, MAX_FILE_LEN);
-               memcpy(_mmap->mm, std::string(newFileName).c_str(), 
std::string(newFileName).size());
-               unLockMMapFile();
-       }
-       else
-       {
-               _mmap = NULL;
-               initMMapFile(newFileName, *_mmapPool);
+       if( m_priv->multiprocess ){
+               if (m_priv->_mmap && !isMapFileEmpty(m_priv->_mmapPool))
+               {
+                       lockMMapFile(APR_FLOCK_EXCLUSIVE);
+                       memset(m_priv->_mmap->mm, 0, MAX_FILE_LEN);
+                       memcpy(m_priv->_mmap->mm, 
std::string(newFileName).c_str(), std::string(newFileName).size());
+                       unLockMMapFile();
+               }
+               else
+               {
+                       m_priv->_mmap = NULL;
+                       initMMapFile(newFileName, m_priv->_mmapPool);
+               }
+       }else{
+               m_priv->lastFileName = newFileName;
        }
 
-#else
-       m_priv->lastFileName = newFileName;
-#endif
-
        return std::make_shared<RolloverDescription>(nextActiveFile, append, 
renameAction, compressAction);
 }
 
@@ -458,23 +451,38 @@ bool TimeBasedRollingPolicy::isTriggeringEvent(
        const LogString&  filename,
        size_t /* fileLength */)
 {
-#ifdef LOG4CXX_MULTI_PROCESS
-
-       if (bRefreshCurFile && _mmap && !isMapFileEmpty(*_mmapPool))
-       {
-               lockMMapFile(APR_FLOCK_SHARED);
-               LogString mapCurrent((char*)_mmap->mm);
-               unLockMMapFile();
-               LogString mapCurrentBase(mapCurrent.substr(0, 
mapCurrent.length() - suffixLength));
+       if( m_priv->multiprocess ){
 
-               if (!mapCurrentBase.empty() && mapCurrentBase != filename)
+               if (m_priv->bRefreshCurFile && m_priv->_mmap && 
!isMapFileEmpty(m_priv->_mmapPool))
                {
-                       
dynamic_cast<FileAppender*>(appender)->setFile(mapCurrentBase);
+                       lockMMapFile(APR_FLOCK_SHARED);
+                       LogString mapCurrent((char*)m_priv->_mmap->mm);
+                       unLockMMapFile();
+                       LogString mapCurrentBase(mapCurrent.substr(0, 
mapCurrent.length() - m_priv->suffixLength));
+
+                       if (!mapCurrentBase.empty() && mapCurrentBase != 
filename)
+                       {
+                               const FileAppender* fappend = 
reinterpret_cast<const 
FileAppender*>(appender->cast(FileAppender::getStaticClass()));
+                               if( fappend ){
+                                       
const_cast<FileAppender*>(fappend)->setFile(mapCurrentBase);
+                               }
+                       }
                }
+
+               return ( Date::currentTime() > m_priv->nextCheck) || 
(!m_priv->bAlreadyInitialized);
        }
 
-       return ((apr_time_now()) > nextCheck) || (!bAlreadyInitialized);
-#else
        return Date::currentTime() > m_priv->nextCheck;
-#endif
+}
+
+void TimeBasedRollingPolicy::setOption(const LogString& option,
+                                                                          
const LogString& value){
+       if (StringHelper::equalsIgnoreCase(option,
+                       LOG4CXX_STR("MULTIPROCESS"),
+                       LOG4CXX_STR("multiprocess")))
+       {
+               m_priv->multiprocess = OptionConverter::toBoolean(value, false);
+       }
+
+       RollingPolicyBase::setOption(option, value);
 }
diff --git a/src/main/cpp/writer.cpp b/src/main/cpp/writer.cpp
index 312aa527..42f197be 100644
--- a/src/main/cpp/writer.cpp
+++ b/src/main/cpp/writer.cpp
@@ -17,6 +17,7 @@
 
 #include <log4cxx/logstring.h>
 #include <log4cxx/helpers/writer.h>
+#include <log4cxx/helpers/loglog.h>
 #include <stdexcept>
 
 using namespace log4cxx::helpers;
@@ -30,10 +31,3 @@ Writer::Writer()
 Writer::~Writer()
 {
 }
-
-#ifdef LOG4CXX_MULTI_PROCESS
-OutputStreamPtr Writer::getOutPutStreamPtr()
-{
-       throw std::logic_error("getOutPutStreamPtr must be implemented in the 
derived class that you are using");
-}
-#endif
diff --git a/src/main/cpp/writerappender.cpp b/src/main/cpp/writerappender.cpp
index 02fe154a..ada3bd89 100644
--- a/src/main/cpp/writerappender.cpp
+++ b/src/main/cpp/writerappender.cpp
@@ -321,3 +321,7 @@ bool WriterAppender::getImmediateFlush() const
 {
        return _priv->immediateFlush;
 }
+
+const log4cxx::helpers::WriterPtr WriterAppender::getWriter() const{
+       return _priv->writer;
+}
diff --git a/src/main/include/log4cxx/helpers/fileoutputstream.h 
b/src/main/include/log4cxx/helpers/fileoutputstream.h
index 322d8a77..baacb2ba 100644
--- a/src/main/include/log4cxx/helpers/fileoutputstream.h
+++ b/src/main/include/log4cxx/helpers/fileoutputstream.h
@@ -52,12 +52,8 @@ class LOG4CXX_EXPORT FileOutputStream : public OutputStream
                virtual void flush(Pool& p);
                virtual void write(ByteBuffer& buf, Pool& p);
 
-#ifdef LOG4CXX_MULTI_PROCESS
-               apr_file_t* getFilePtr()
-               {
-                       return fileptr;
-               }
-#endif
+               apr_file_t* getFilePtr() const;
+
        private:
                FileOutputStream(const FileOutputStream&);
                FileOutputStream& operator=(const FileOutputStream&);
diff --git a/src/main/include/log4cxx/helpers/outputstream.h 
b/src/main/include/log4cxx/helpers/outputstream.h
index a72e45f4..d1ec12c6 100644
--- a/src/main/include/log4cxx/helpers/outputstream.h
+++ b/src/main/include/log4cxx/helpers/outputstream.h
@@ -19,9 +19,6 @@
 #define _LOG4CXX_HELPERS_OUTPUTSTREAM_H
 
 #include <log4cxx/helpers/object.h>
-#ifdef LOG4CXX_MULTI_PROCESS
-       #include <apr_file_io.h>
-#endif
 
 namespace log4cxx
 {
@@ -49,10 +46,6 @@ class LOG4CXX_EXPORT OutputStream : public Object
                virtual void close(Pool& p) = 0;
                virtual void flush(Pool& p) = 0;
                virtual void write(ByteBuffer& buf, Pool& p) = 0;
-#ifdef LOG4CXX_MULTI_PROCESS
-               virtual apr_file_t* getFilePtr();
-               virtual OutputStream& getFileOutPutStreamPtr();
-#endif
 
        private:
                OutputStream(const OutputStream&);
diff --git a/src/main/include/log4cxx/helpers/outputstreamwriter.h 
b/src/main/include/log4cxx/helpers/outputstreamwriter.h
index b3086f5f..7f2a196b 100644
--- a/src/main/include/log4cxx/helpers/outputstreamwriter.h
+++ b/src/main/include/log4cxx/helpers/outputstreamwriter.h
@@ -52,7 +52,7 @@ class LOG4CXX_EXPORT OutputStreamWriter : public Writer
                virtual void write(const LogString& str, Pool& p);
                LogString getEncoding() const;
 
-               OutputStreamPtr getOutPutStreamPtr() const;
+               OutputStreamPtr getOutputStreamPtr() const;
 
        private:
                OutputStreamWriter(const OutputStreamWriter&);
diff --git a/src/main/include/log4cxx/helpers/writer.h 
b/src/main/include/log4cxx/helpers/writer.h
index a7c054d2..8c95d5d5 100644
--- a/src/main/include/log4cxx/helpers/writer.h
+++ b/src/main/include/log4cxx/helpers/writer.h
@@ -46,9 +46,6 @@ class LOG4CXX_EXPORT Writer : public Object
                virtual void close(Pool& p) = 0;
                virtual void flush(Pool& p) = 0;
                virtual void write(const LogString& str, Pool& p) = 0;
-#ifdef LOG4CXX_MULTI_PROCESS
-               virtual OutputStreamPtr getOutPutStreamPtr();
-#endif
 
        private:
                Writer(const Writer&);
diff --git a/src/main/include/log4cxx/rolling/rollingfileappenderskeleton.h 
b/src/main/include/log4cxx/rolling/multiprocessrollingfileappender.h
similarity index 78%
rename from src/main/include/log4cxx/rolling/rollingfileappenderskeleton.h
rename to src/main/include/log4cxx/rolling/multiprocessrollingfileappender.h
index 3dfa3951..717b2d5b 100644
--- a/src/main/include/log4cxx/rolling/rollingfileappenderskeleton.h
+++ b/src/main/include/log4cxx/rolling/multiprocessrollingfileappender.h
@@ -15,9 +15,10 @@
  * limitations under the License.
  */
 
-#if !defined(_LOG4CXX_ROLLING_ROLLING_FILE_APPENDER_SKELETON_H)
-#define _LOG4CXX_ROLLING_ROLLING_FILE_APPENDER_SKELETON_H
+#if !defined(LOG4CXX_ROLLING_MULTIPROCESS_ROLLING_FILE_APPENDER_H)
+#define LOG4CXX_ROLLING_MULTIPROCESS_ROLLING_FILE_APPENDER_H
 
+#include <log4cxx/fileappender.h>
 #include <log4cxx/spi/optionhandler.h>
 #include <log4cxx/fileappender.h>
 #include <log4cxx/rolling/triggeringpolicy.h>
@@ -31,44 +32,20 @@ namespace rolling
 
 
 /**
- *  Base class for log4cxx::rolling::RollingFileAppender and 
log4cxx::RollingFileAppender
- * (analogues of org.apache.log4j.rolling.RFA from extras companion and
- *  org.apache.log4j.RFA from log4j 1.2, respectively).
- *
- * */
-class LOG4CXX_EXPORT RollingFileAppenderSkeleton : public FileAppender
+ * A special version of the RollingFileAppender that acts properly with 
multiple processes
+ */
+class LOG4CXX_EXPORT MultiprocessRollingFileAppender : public FileAppender
 {
-               DECLARE_LOG4CXX_OBJECT(RollingFileAppenderSkeleton)
+               DECLARE_LOG4CXX_OBJECT(MultiprocessRollingFileAppender)
                BEGIN_LOG4CXX_CAST_MAP()
-               LOG4CXX_CAST_ENTRY(RollingFileAppenderSkeleton)
+               LOG4CXX_CAST_ENTRY(MultiprocessRollingFileAppender)
                LOG4CXX_CAST_ENTRY_CHAIN(FileAppender)
                END_LOG4CXX_CAST_MAP()
+       protected:
+               struct MultiprocessRollingFileAppenderPriv;
 
-               /**
-                * Triggering policy.
-                */
-               TriggeringPolicyPtr triggeringPolicy;
-
-               /**
-                * Rolling policy.
-                */
-               RollingPolicyPtr rollingPolicy;
-
-               /**
-                * Length of current active log file.
-                */
-               size_t fileLength;
-
-               /**
-                *  save the loggingevent
-                */
-               spi::LoggingEventPtr* _event;
        public:
-               /**
-                * The default constructor simply calls its {@link
-                * FileAppender#FileAppender parents constructor}.
-                * */
-               RollingFileAppenderSkeleton();
+               MultiprocessRollingFileAppender();
 
                void activateOptions(log4cxx::helpers::Pool&);
 
@@ -98,7 +75,7 @@ class LOG4CXX_EXPORT RollingFileAppenderSkeleton : public 
FileAppender
 
                bool rolloverInternal(log4cxx::helpers::Pool& p);
 
-       protected:
+       public:
 
                RollingPolicyPtr getRollingPolicy() const;
 
@@ -133,16 +110,19 @@ class LOG4CXX_EXPORT RollingFileAppenderSkeleton : public 
FileAppender
                log4cxx::helpers::WriterPtr 
createWriter(log4cxx::helpers::OutputStreamPtr& os);
 
        public:
-
-
-
                /**
                 * Get byte length of current active log file.
                 * @return byte length of current active log file.
                 */
                size_t getFileLength() const;
 
-#ifdef LOG4CXX_MULTI_PROCESS
+               /**
+                * Increments estimated byte length of current active log file.
+                * @param increment additional bytes written to log file.
+                */
+               void incrementFileLength(size_t increment);
+
+       private:
                /**
                 * Set byte length of current active log file.
                 * @return void
@@ -159,18 +139,12 @@ class LOG4CXX_EXPORT RollingFileAppenderSkeleton : public 
FileAppender
                 * @return void
                 */
                void reopenLatestFile(log4cxx::helpers::Pool& p);
-#endif
 
-               /**
-                * Increments estimated byte length of current active log file.
-                * @param increment additional bytes written to log file.
-                */
-               void incrementFileLength(size_t increment);
+               friend class CountingOutputStream;
 
 };
 
-
-LOG4CXX_PTR_DEF(RollingFileAppenderSkeleton);
+LOG4CXX_PTR_DEF(MultiprocessRollingFileAppender);
 
 }
 }
diff --git a/src/main/include/log4cxx/rolling/rollingfileappender.h 
b/src/main/include/log4cxx/rolling/rollingfileappender.h
index 840d03a4..603dffe4 100644
--- a/src/main/include/log4cxx/rolling/rollingfileappender.h
+++ b/src/main/include/log4cxx/rolling/rollingfileappender.h
@@ -152,34 +152,12 @@ class LOG4CXX_EXPORT RollingFileAppender : public 
FileAppender
                log4cxx::helpers::WriterPtr 
createWriter(log4cxx::helpers::OutputStreamPtr& os);
 
        public:
-
-
-
                /**
                 * Get byte length of current active log file.
                 * @return byte length of current active log file.
                 */
                size_t getFileLength() const;
 
-#ifdef LOG4CXX_MULTI_PROCESS
-               /**
-                * Set byte length of current active log file.
-                * @return void
-                */
-               void setFileLength(size_t length);
-
-               /**
-                *  Release the file lock
-                * @return void
-                */
-               void releaseFileLock(apr_file_t* lock_file);
-               /**
-                * re-open the latest file when its own handler has been renamed
-                * @return void
-                */
-               void reopenLatestFile(log4cxx::helpers::Pool& p);
-#endif
-
                /**
                 * Increments estimated byte length of current active log file.
                 * @param increment additional bytes written to log file.
diff --git a/src/main/include/log4cxx/rolling/rollingpolicybase.h 
b/src/main/include/log4cxx/rolling/rollingpolicybase.h
index c9fdae21..0f7a4bb5 100644
--- a/src/main/include/log4cxx/rolling/rollingpolicybase.h
+++ b/src/main/include/log4cxx/rolling/rollingpolicybase.h
@@ -77,13 +77,8 @@ class LOG4CXX_EXPORT RollingPolicyBase :
                bool getCreateIntermediateDirectories() const;
                void setCreateIntermediateDirectories(bool createIntermediate);
 
+               PatternConverterList getPatternConverterList() const;
 
-#ifdef LOG4CXX_MULTI_PROCESS
-               PatternConverterList getPatternConverterList()
-               {
-                       return patternConverters;
-               }
-#endif
        protected:
                RollingPolicyBase(LOG4CXX_PRIVATE_PTR(RollingPolicyBasePrivate) 
priv);
                /**
@@ -104,6 +99,9 @@ class LOG4CXX_EXPORT RollingPolicyBase :
                log4cxx::pattern::PatternConverterPtr 
getIntegerPatternConverter() const;
                log4cxx::pattern::PatternConverterPtr getDatePatternConverter() 
const;
 };
+
+LOG4CXX_PTR_DEF(RollingPolicyBase);
+
 }
 }
 
diff --git a/src/main/include/log4cxx/rolling/timebasedrollingpolicy.h 
b/src/main/include/log4cxx/rolling/timebasedrollingpolicy.h
index 60b1e200..8aaf60a7 100755
--- a/src/main/include/log4cxx/rolling/timebasedrollingpolicy.h
+++ b/src/main/include/log4cxx/rolling/timebasedrollingpolicy.h
@@ -161,39 +161,8 @@ class LOG4CXX_EXPORT TimeBasedRollingPolicy : public 
RollingPolicyBase,
                virtual ~TimeBasedRollingPolicy();
                void activateOptions(log4cxx::helpers::Pool& );
 
-#ifdef LOG4CXX_MULTI_PROCESS
-               virtual ~TimeBasedRollingPolicy();
-
-               /**
-                * Generate mmap file
-                */
-               int createMMapFile(const std::string& lastfilename, 
log4cxx::helpers::Pool& pool);
-
-               /**
-                *  Detect if the mmap file is empty
-                */
-               bool isMapFileEmpty(log4cxx::helpers::Pool& pool);
-
-               /**
-                *   init MMapFile
-                */
-               void initMMapFile(const LogString& lastFileName, 
log4cxx::helpers::Pool& pool);
-
-               /**
-                *   lock MMapFile
-                */
-               int lockMMapFile(int type);
-
-               /**
-                *   unlock MMapFile
-                */
-               int unLockMMapFile();
-
-               /**
-                *   create MMapFile/lockFile
-                */
-               const std::string createFile(const std::string& filename, const 
std::string& suffix, log4cxx::helpers::Pool& pool);
-#endif
+               void setOption(const LogString& option,
+                                       const LogString& value);
 
                /**
                 * {@inheritDoc}
@@ -231,6 +200,38 @@ class LOG4CXX_EXPORT TimeBasedRollingPolicy : public 
RollingPolicyBase,
        protected:
                log4cxx::pattern::PatternMap getFormatSpecifiers() const;
 
+       private:
+
+               /**
+                * Generate mmap file
+                */
+               int createMMapFile(const std::string& lastfilename, 
log4cxx::helpers::Pool& pool);
+
+               /**
+                *  Detect if the mmap file is empty
+                */
+               bool isMapFileEmpty(log4cxx::helpers::Pool& pool);
+
+               /**
+                *   init MMapFile
+                */
+               void initMMapFile(const LogString& lastFileName, 
log4cxx::helpers::Pool& pool);
+
+               /**
+                *   lock MMapFile
+                */
+               int lockMMapFile(int type);
+
+               /**
+                *   unlock MMapFile
+                */
+               int unLockMMapFile();
+
+               /**
+                *   create MMapFile/lockFile
+                */
+               const std::string createFile(const std::string& filename, const 
std::string& suffix, log4cxx::helpers::Pool& pool);
+
 };
 
 LOG4CXX_PTR_DEF(TimeBasedRollingPolicy);
diff --git a/src/main/include/log4cxx/writerappender.h 
b/src/main/include/log4cxx/writerappender.h
index e77d75ad..8b276918 100644
--- a/src/main/include/log4cxx/writerappender.h
+++ b/src/main/include/log4cxx/writerappender.h
@@ -156,12 +156,8 @@ class LOG4CXX_EXPORT WriterAppender : public 
AppenderSkeleton
                  <p>
                  @param writer An already opened Writer.  */
                void setWriter(const log4cxx::helpers::WriterPtr& writer);
-#ifdef LOG4CXX_MULTI_PROCESS
-               const log4cxx::helpers::WriterPtr getWriter()
-               {
-                       return writer;
-               };
-#endif
+
+               const log4cxx::helpers::WriterPtr getWriter() const;
 
                virtual bool requiresLayout() const;
 


Reply via email to