llapr.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:10k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llapr.h
  3.  * @author Phoenix
  4.  * @date 2004-11-28
  5.  * @brief Helper functions for using the apache portable runtime library.
  6.  *
  7.  * $LicenseInfo:firstyear=2004&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2004-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. #ifndef LL_LLAPR_H
  35. #define LL_LLAPR_H
  36. #if LL_LINUX || LL_SOLARIS
  37. #include <sys/param.h>  // Need PATH_MAX in APR headers...
  38. #endif
  39. #if LL_WINDOWS
  40. // Limit Windows API to small and manageable set.
  41. // If you get undefined symbols, find the appropriate
  42. // Windows header file and include that in your .cpp file.
  43. #define WIN32_LEAN_AND_MEAN
  44. #include <winsock2.h>
  45. #include <windows.h>
  46. #endif
  47. #include <boost/noncopyable.hpp>
  48. #include "apr_thread_proc.h"
  49. #include "apr_thread_mutex.h"
  50. #include "apr_getopt.h"
  51. #include "apr_signal.h"
  52. #include "apr_atomic.h"
  53. #include "llstring.h"
  54. extern LL_COMMON_API apr_thread_mutex_t* gLogMutexp;
  55. extern apr_thread_mutex_t* gCallStacksLogMutexp;
  56. /** 
  57.  * @brief initialize the common apr constructs -- apr itself, the
  58.  * global pool, and a mutex.
  59.  */
  60. void LL_COMMON_API ll_init_apr();
  61. /** 
  62.  * @brief Cleanup those common apr constructs.
  63.  */
  64. void LL_COMMON_API ll_cleanup_apr();
  65. //
  66. //LL apr_pool
  67. //manage apr_pool_t, destroy allocated apr_pool in the destruction function.
  68. //
  69. class LL_COMMON_API LLAPRPool
  70. {
  71. public:
  72. LLAPRPool(apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE) ;
  73. virtual ~LLAPRPool() ;
  74. virtual apr_pool_t* getAPRPool() ;
  75. apr_status_t getStatus() {return mStatus ; }
  76. protected:
  77. void releaseAPRPool() ;
  78. void createAPRPool() ;
  79. protected:
  80. apr_pool_t*  mPool ;              //pointing to an apr_pool
  81. apr_pool_t*  mParent ;   //parent pool
  82. apr_size_t   mMaxSize ;           //max size of mPool, mPool should return memory to system if allocated memory beyond this limit. However it seems not to work.
  83. apr_status_t mStatus ;            //status when creating the pool
  84. BOOL         mReleasePoolFlag ;   //if set, mPool is destroyed when LLAPRPool is deleted. default value is true.
  85. };
  86. //
  87. //volatile LL apr_pool
  88. //which clears memory automatically.
  89. //so it can not hold static data or data after memory is cleared
  90. //
  91. class LL_COMMON_API LLVolatileAPRPool : public LLAPRPool
  92. {
  93. public:
  94. LLVolatileAPRPool(BOOL is_local = TRUE, apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE);
  95. virtual ~LLVolatileAPRPool();
  96. /*virtual*/ apr_pool_t* getAPRPool() ; //define this virtual function to avoid any mistakenly calling LLAPRPool::getAPRPool().
  97. apr_pool_t* getVolatileAPRPool() ;
  98. void        clearVolatileAPRPool() ;
  99. BOOL        isFull() ;
  100. private:
  101. S32 mNumActiveRef ; //number of active pointers pointing to the apr_pool.
  102. S32 mNumTotalRef ;  //number of total pointers pointing to the apr_pool since last creating.  
  103. apr_thread_mutex_t *mMutexp;
  104. apr_pool_t         *mMutexPool;
  105. } ;
  106. /** 
  107.  * @class LLScopedLock
  108.  * @brief Small class to help lock and unlock mutexes.
  109.  *
  110.  * This class is used to have a stack level lock once you already have
  111.  * an apr mutex handy. The constructor handles the lock, and the
  112.  * destructor handles the unlock. Instances of this class are
  113.  * <b>not</b> thread safe.
  114.  */
  115. class LL_COMMON_API LLScopedLock : private boost::noncopyable
  116. {
  117. public:
  118. /**
  119.  * @brief Constructor which accepts a mutex, and locks it.
  120.  *
  121.  * @param mutex An allocated APR mutex. If you pass in NULL,
  122.  * this wrapper will not lock.
  123.  */
  124. LLScopedLock(apr_thread_mutex_t* mutex);
  125. /**
  126.  * @brief Destructor which unlocks the mutex if still locked.
  127.  */
  128. ~LLScopedLock();
  129. /** 
  130.  * @brief Check lock.
  131.  */
  132. bool isLocked() const { return mLocked; }
  133. /** 
  134.  * @brief This method unlocks the mutex.
  135.  */
  136. void unlock();
  137. protected:
  138. bool mLocked;
  139. apr_thread_mutex_t* mMutex;
  140. };
  141. template <typename Type> class LLAtomic32
  142. {
  143. public:
  144. LLAtomic32<Type>() {};
  145. LLAtomic32<Type>(Type x) {apr_atomic_set32(&mData, apr_uint32_t(x)); };
  146. ~LLAtomic32<Type>() {};
  147. operator const Type() { apr_uint32_t data = apr_atomic_read32(&mData); return Type(data); }
  148. Type operator =(const Type& x) { apr_atomic_set32(&mData, apr_uint32_t(x)); return Type(mData); }
  149. void operator -=(Type x) { apr_atomic_sub32(&mData, apr_uint32_t(x)); }
  150. void operator +=(Type x) { apr_atomic_add32(&mData, apr_uint32_t(x)); }
  151. Type operator ++(int) { return apr_atomic_inc32(&mData); } // Type++
  152. Type operator --(int) { return apr_atomic_dec32(&mData); } // Type--
  153. private:
  154. apr_uint32_t mData;
  155. };
  156. typedef LLAtomic32<U32> LLAtomicU32;
  157. typedef LLAtomic32<S32> LLAtomicS32;
  158. // File IO convenience functions.
  159. // Returns NULL if the file fails to openm sets *sizep to file size of not NULL
  160. // abbreviated flags
  161. #define LL_APR_R (APR_READ) // "r"
  162. #define LL_APR_W (APR_CREATE|APR_TRUNCATE|APR_WRITE) // "w"
  163. #define LL_APR_RB (APR_READ|APR_BINARY) // "rb"
  164. #define LL_APR_WB (APR_CREATE|APR_TRUNCATE|APR_WRITE|APR_BINARY) // "wb"
  165. #define LL_APR_RPB (APR_READ|APR_WRITE|APR_BINARY) // "r+b"
  166. #define LL_APR_WPB (APR_CREATE|APR_TRUNCATE|APR_READ|APR_WRITE|APR_BINARY) // "w+b"
  167. //
  168. //apr_file manager
  169. //which: 1)only keeps one file open;
  170. //       2)closes the open file in the destruction function
  171. //       3)informs the apr_pool to clean the memory when the file is closed.
  172. //Note: please close an open file at the earliest convenience. 
  173. //      especially do not put some time-costly operations between open() and close().
  174. //      otherwise it might lock the APRFilePool.
  175. //there are two different apr_pools the APRFile can use:
  176. //      1, a temperary pool passed to an APRFile function, which is used within this function and only once.
  177. //      2, a global pool.
  178. //
  179. class LL_COMMON_API LLAPRFile : boost::noncopyable
  180. {
  181. // make this non copyable since a copy closes the file
  182. private:
  183. apr_file_t* mFile ;
  184. LLVolatileAPRPool *mCurrentFilePoolp ; //currently in use apr_pool, could be one of them: sAPRFilePoolp, or a temp pool. 
  185. public:
  186. LLAPRFile() ;
  187. LLAPRFile(const std::string& filename, apr_int32_t flags, LLVolatileAPRPool* pool = NULL);
  188. ~LLAPRFile() ;
  189. apr_status_t open(const std::string& filename, apr_int32_t flags, LLVolatileAPRPool* pool = NULL, S32* sizep = NULL);
  190. apr_status_t open(const std::string& filename, apr_int32_t flags, BOOL use_global_pool); //use gAPRPoolp.
  191. apr_status_t close() ;
  192. // Returns actual offset, -1 if seek fails
  193. S32 seek(apr_seek_where_t where, S32 offset);
  194. apr_status_t eof() { return apr_file_eof(mFile);}
  195. // Returns bytes read/written, 0 if read/write fails:
  196. S32 read(void* buf, S32 nbytes);
  197. S32 write(const void* buf, S32 nbytes);
  198. apr_file_t* getFileHandle() {return mFile;}
  199. private:
  200. apr_pool_t* getAPRFilePool(apr_pool_t* pool) ;
  201. //
  202. //*******************************************************************************************************************************
  203. //static components
  204. //
  205. public:
  206. static LLVolatileAPRPool *sAPRFilePoolp ; //a global apr_pool for APRFile, which is used only when local pool does not exist.
  207. private:
  208. static apr_file_t* open(const std::string& filename, LLVolatileAPRPool* pool, apr_int32_t flags);
  209. static apr_status_t close(apr_file_t* file, LLVolatileAPRPool* pool) ;
  210. static S32 seek(apr_file_t* file, apr_seek_where_t where, S32 offset);
  211. public:
  212. // returns false if failure:
  213. static bool remove(const std::string& filename, LLVolatileAPRPool* pool = NULL);
  214. static bool rename(const std::string& filename, const std::string& newname, LLVolatileAPRPool* pool = NULL);
  215. static bool isExist(const std::string& filename, LLVolatileAPRPool* pool = NULL, apr_int32_t flags = APR_READ);
  216. static S32 size(const std::string& filename, LLVolatileAPRPool* pool = NULL);
  217. static bool makeDir(const std::string& dirname, LLVolatileAPRPool* pool = NULL);
  218. static bool removeDir(const std::string& dirname, LLVolatileAPRPool* pool = NULL);
  219. // Returns bytes read/written, 0 if read/write fails:
  220. static S32 readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL);
  221. static S32 writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL);
  222. //*******************************************************************************************************************************
  223. };
  224. /**
  225.  * @brief Function which approprately logs error or remains quiet on
  226.  * APR_SUCCESS.
  227.  * @return Returns <code>true</code> if status is an error condition.
  228.  */
  229. bool LL_COMMON_API ll_apr_warn_status(apr_status_t status);
  230. void LL_COMMON_API ll_apr_assert_status(apr_status_t status);
  231. extern "C" LL_COMMON_API apr_pool_t* gAPRPoolp; // Global APR memory pool
  232. #endif // LL_LLAPR_H