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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llfloatermemleak.cpp
  3.  * @brief LLFloatermemleak class definition
  4.  *
  5.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2007-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "llfloatermemleak.h"
  34. #include "lluictrlfactory.h"
  35. #include "llbutton.h"
  36. #include "llspinctrl.h"
  37. #include "llresmgr.h"
  38. #include "llmath.h"
  39. #include "llviewerwindow.h"
  40. U32 LLFloaterMemLeak::sMemLeakingSpeed = 0 ; //bytes leaked per frame
  41. U32 LLFloaterMemLeak::sMaxLeakedMem = 0 ; //maximum allowed leaked memory
  42. U32 LLFloaterMemLeak::sTotalLeaked = 0 ;
  43. S32 LLFloaterMemLeak::sStatus = LLFloaterMemLeak::STOP ;
  44. BOOL LLFloaterMemLeak::sbAllocationFailed = FALSE ;
  45. LLFloaterMemLeak::LLFloaterMemLeak(const LLSD& key)
  46. : LLFloater(key)
  47. {
  48. setTitle("Memory Leaking Simulation Floater");
  49. mCommitCallbackRegistrar.add("MemLeak.ChangeLeakingSpeed", boost::bind(&LLFloaterMemLeak::onChangeLeakingSpeed, this));
  50. mCommitCallbackRegistrar.add("MemLeak.ChangeMaxMemLeaking", boost::bind(&LLFloaterMemLeak::onChangeMaxMemLeaking, this));
  51. mCommitCallbackRegistrar.add("MemLeak.Start", boost::bind(&LLFloaterMemLeak::onClickStart, this));
  52. mCommitCallbackRegistrar.add("MemLeak.Stop", boost::bind(&LLFloaterMemLeak::onClickStop, this));
  53. mCommitCallbackRegistrar.add("MemLeak.Release", boost::bind(&LLFloaterMemLeak::onClickRelease, this));
  54. mCommitCallbackRegistrar.add("MemLeak.Close", boost::bind(&LLFloaterMemLeak::onClickClose, this));
  55. }
  56. //----------------------------------------------
  57. BOOL LLFloaterMemLeak::postBuild(void) 
  58. {
  59. F32 a, b ;
  60. a = childGetValue("leak_speed").asReal();
  61. if(a > (F32)(0xFFFFFFFF))
  62. {
  63. sMemLeakingSpeed = 0xFFFFFFFF ;
  64. }
  65. else
  66. {
  67. sMemLeakingSpeed = (U32)a ;
  68. }
  69. b = childGetValue("max_leak").asReal();
  70. if(b > (F32)0xFFF)
  71. {
  72. sMaxLeakedMem = 0xFFFFFFFF ;
  73. }
  74. else
  75. {
  76. sMaxLeakedMem = ((U32)b) << 20 ;
  77. }
  78. sbAllocationFailed = FALSE ;
  79. return TRUE ;
  80. }
  81. LLFloaterMemLeak::~LLFloaterMemLeak()
  82. {
  83. release() ;
  84. sMemLeakingSpeed = 0 ; //bytes leaked per frame
  85. sMaxLeakedMem = 0 ; //maximum allowed leaked memory
  86. }
  87. void LLFloaterMemLeak::release()
  88. {
  89. for(S32 i = 0 ; i < (S32)mLeakedMem.size() ; i++)
  90. {
  91. delete[] mLeakedMem[i] ;
  92. }
  93. mLeakedMem.clear() ;
  94. sStatus = STOP ;
  95. sTotalLeaked = 0 ;
  96. sbAllocationFailed = FALSE ;
  97. }
  98. void LLFloaterMemLeak::stop()
  99. {
  100. sStatus = STOP ;
  101. sbAllocationFailed = TRUE ;
  102. }
  103. void LLFloaterMemLeak::idle()
  104. {
  105. if(STOP == sStatus)
  106. {
  107. return ;
  108. }
  109. sbAllocationFailed = FALSE ;
  110. if(RELEASE == sStatus)
  111. {
  112. release() ;
  113. return ;
  114. }
  115. char* p = NULL ;
  116. if(sMemLeakingSpeed > 0 && sTotalLeaked < sMaxLeakedMem)
  117. {
  118. p = new char[sMemLeakingSpeed] ;
  119. if(p)
  120. {
  121. mLeakedMem.push_back(p) ;
  122. sTotalLeaked += sMemLeakingSpeed ;
  123. }
  124. }
  125. if(!p)
  126. {
  127. sStatus = STOP ;
  128. sbAllocationFailed = TRUE ;
  129. }
  130. }
  131. //----------------------
  132. void LLFloaterMemLeak::onChangeLeakingSpeed()
  133. {
  134. F32 tmp ;
  135. tmp =childGetValue("leak_speed").asReal();
  136. if(tmp > (F32)0xFFFFFFFF)
  137. {
  138. sMemLeakingSpeed = 0xFFFFFFFF ;
  139. }
  140. else
  141. {
  142. sMemLeakingSpeed = (U32)tmp ;
  143. }
  144. }
  145. void LLFloaterMemLeak::onChangeMaxMemLeaking()
  146. {
  147. F32 tmp ;
  148. tmp =childGetValue("max_leak").asReal();
  149. if(tmp > (F32)0xFFF)
  150. {
  151. sMaxLeakedMem = 0xFFFFFFFF ;
  152. }
  153. else
  154. {
  155. sMaxLeakedMem = ((U32)tmp) << 20 ;
  156. }
  157. }
  158. void LLFloaterMemLeak::onClickStart()
  159. {
  160. sStatus = START ;
  161. }
  162. void LLFloaterMemLeak::onClickStop()
  163. {
  164. sStatus = STOP ;
  165. }
  166. void LLFloaterMemLeak::onClickRelease()
  167. {
  168. sStatus = RELEASE ;
  169. }
  170. void LLFloaterMemLeak::onClickClose()
  171. {
  172. setVisible(FALSE);
  173. }
  174. void LLFloaterMemLeak::draw()
  175. {
  176. //show total memory leaked
  177. if(sTotalLeaked > 0)
  178. {
  179. std::string bytes_string;
  180. LLResMgr::getInstance()->getIntegerString(bytes_string, sTotalLeaked >> 10 );
  181. childSetTextArg("total_leaked_label", "[SIZE]", bytes_string);
  182. }
  183. else
  184. {
  185. childSetTextArg("total_leaked_label", "[SIZE]", LLStringExplicit("0"));
  186. }
  187. if(sbAllocationFailed)
  188. {
  189. childSetTextArg("note_label_1", "[NOTE1]", LLStringExplicit("Memory leaking simulation stops. Reduce leaking speed or"));
  190. childSetTextArg("note_label_2", "[NOTE2]", LLStringExplicit("increase max leaked memory, then press Start to continue."));
  191. }
  192. else
  193. {
  194. childSetTextArg("note_label_1", "[NOTE1]", LLStringExplicit(""));
  195. childSetTextArg("note_label_2", "[NOTE2]", LLStringExplicit(""));
  196. }
  197. LLFloater::draw();
  198. }