Added a thread-safe and robust wrapper for APR pools.
See http://redmine.imprudenceviewer.org/issues/590 and https://jira.secondlife.com/browse/SNOW-596
This commit is contained in:
@@ -36,11 +36,12 @@
|
||||
#define LL_LLPUMPIO_H
|
||||
|
||||
#include <set>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#if LL_LINUX // needed for PATH_MAX in APR.
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
|
||||
#include "apr_pools.h"
|
||||
#include "aiaprpool.h"
|
||||
#include "llbuffer.h"
|
||||
#include "llframetimer.h"
|
||||
#include "lliopipe.h"
|
||||
@@ -64,9 +65,8 @@ extern const F32 NEVER_CHAIN_EXPIRY_SECS;
|
||||
* <code>pump()</code> on a thread used for IO and call
|
||||
* <code>respond()</code> on a thread that is expected to do higher
|
||||
* level processing. You can call almost any other method from any
|
||||
* thread - see notes for each method for details. In order for the
|
||||
* threading abstraction to work, you need to call <code>prime()</code>
|
||||
* with a valid apr pool.
|
||||
* thread - see notes for each method for details.
|
||||
*
|
||||
* A pump instance manages much of the state for the pipe, including
|
||||
* the list of pipes in the chain, the channel for each element in the
|
||||
* chain, the buffer, and if any pipe has marked the stream or process
|
||||
@@ -85,24 +85,13 @@ public:
|
||||
/**
|
||||
* @brief Constructor.
|
||||
*/
|
||||
LLPumpIO(apr_pool_t* pool);
|
||||
LLPumpIO(void);
|
||||
|
||||
/**
|
||||
* @brief Destructor.
|
||||
*/
|
||||
~LLPumpIO();
|
||||
|
||||
/**
|
||||
* @brief Prepare this pump for usage.
|
||||
*
|
||||
* If you fail to call this method prior to use, the pump will
|
||||
* try to work, but will not come with any thread locking
|
||||
* mechanisms.
|
||||
* @param pool The apr pool to use.
|
||||
* @return Returns true if the pump is primed.
|
||||
*/
|
||||
bool prime(apr_pool_t* pool);
|
||||
|
||||
/**
|
||||
* @brief Typedef for having a chain of pipes.
|
||||
*/
|
||||
@@ -374,6 +363,7 @@ protected:
|
||||
typedef std::pair<LLIOPipe::ptr_t, apr_pollfd_t> pipe_conditional_t;
|
||||
typedef std::vector<pipe_conditional_t> conditionals_t;
|
||||
conditionals_t mDescriptors;
|
||||
boost::shared_ptr<AIAPRPool> mDescriptorsPool;
|
||||
};
|
||||
|
||||
// All the running chains & info
|
||||
@@ -392,9 +382,9 @@ protected:
|
||||
callbacks_t mPendingCallbacks;
|
||||
callbacks_t mCallbacks;
|
||||
|
||||
// memory allocator for pollsets & mutexes.
|
||||
apr_pool_t* mPool;
|
||||
apr_pool_t* mCurrentPool;
|
||||
// Memory pool for pollsets & mutexes.
|
||||
AIAPRPool mPool;
|
||||
AIAPRPool mCurrentPool;
|
||||
S32 mCurrentPoolReallocCount;
|
||||
|
||||
#if LL_THREADS_APR
|
||||
@@ -406,8 +396,7 @@ protected:
|
||||
#endif
|
||||
|
||||
protected:
|
||||
void initialize(apr_pool_t* pool);
|
||||
void cleanup();
|
||||
void initialize();
|
||||
|
||||
/**
|
||||
* @brief Given the internal state of the chains, rebuild the pollset
|
||||
|
||||
Reference in New Issue
Block a user