Changeset 360 for trunk/Include/system/gc.sbp
- Timestamp:
- Oct 21, 2007, 8:01:08 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Include/system/gc.sbp
r330 r360 1 /* 2 このファイルでは、ABのガベージコレクションの実装を行います。1 /*! 2 @brief このファイルでは、ABのガベージコレクションの実装を行います。 3 3 */ 4 4 … … 25 25 Class _System_CGarbageCollection 26 26 27 ppPtr As *VoidPtr 28 pSize As *SIZE_T 29 pdwFlags As *DWord 30 n As Long 27 ppPtr As *VoidPtr ' 管理するメモリオブジェクトのポインタリスト 28 pSize As *SIZE_T ' 管理するメモリオブジェクトのサイズリスト 29 pdwFlags As *DWord ' 管理するメモリオブジェクトの属性リスト 30 n As Long ' 管理するメモリオブジェクトの個数 31 32 ppEdenMemoryObjectPtrs As *VoidPtr 33 pEdenMemoryObjectSizes As *SIZE_T 34 pdwEdenMemoryObjectFlags As *DWord 35 numOfEden 31 36 32 37 iAllSize As SIZE_T 33 38 34 isSweeping As Boolean 35 39 isSweeping As Boolean ' スウィープ中かどうか 40 41 ' クリティカルセクション 36 42 CriticalSection As CRITICAL_SECTION 37 43 … … 40 46 limitMemoryObjectNum As Long ' メモリオブジェクトの個数単位 41 47 42 isFinish As Boolean 48 isFinish As Boolean ' GC管理が終了したかどうか 43 49 44 50 … … 68 74 Public 69 75 76 /*! 77 @brief 環境変数にGCを登録する 78 @author Daisuke Yamamoto 79 @date 2007/10/21 80 */ 70 81 Static Sub Initialize() 71 82 Dim temporary[255] As Char … … 84 95 End Sub 85 96 97 /*! 98 @brief メモリサイズの上限を指定する 99 @param limitMemorySize メモリサイズの上限(単位はバイト) 100 limitMemoryObjectNum メモリ個数の上限 101 @author Daisuke Yamamoto 102 @date 2007/10/21 103 */ 104 Sub SetLimit( limitMemorySize As LONG_PTR, limitMemoryObjectNum As Long ) 105 This.limitMemorySize = limitMemorySize 106 This.limitMemoryObjectNum = limitMemoryObjectNum 107 End Sub 108 109 /*! 110 @brief 初期化 111 @author Daisuke Yamamoto 112 @date 2007/10/21 113 */ 86 114 Sub Begin() 87 115 If ppPtr Then Exit Sub … … 131 159 132 160 End Sub 161 162 /*! 163 @brief 終了処理 164 @author Daisuke Yamamoto 165 @date 2007/10/21 166 */ 133 167 Sub Finish() 134 168 If ppPtr=0 Then Exit Sub … … 167 201 End Sub 168 202 203 /*! 204 @brief メモリオブジェクトを追加する 205 @param new_ptr メモリオブジェクトへのポインタ 206 size メモリオブジェクトのサイズ 207 flags メモリオブジェクトの属性 208 @author Daisuke Yamamoto 209 @date 2007/10/21 210 */ 169 211 Sub add(new_ptr As VoidPtr, size As SIZE_T, flags As DWord) 170 212 iAllSize+=size … … 179 221 pdwFlags=HeapReAlloc(_System_hProcessHeap,0,pdwFlags,(n+1)*SizeOf(DWord)) 180 222 pdwFlags[n]=flags 223 224 n++ 181 225 LeaveCriticalSection(CriticalSection) 182 226 … … 187 231 End If 188 232 */ 189 190 n++ 191 End Sub 192 193 233 End Sub 234 235 236 /*! 237 @brief メモリオブジェクトを確保する 238 @param size メモリオブジェクトのサイズ 239 flags メモリオブジェクトの属性 240 @author Daisuke Yamamoto 241 @date 2007/10/21 242 */ 194 243 Function __malloc(size As SIZE_T,flags As Byte) As VoidPtr 195 244 ' EnterCriticalSection(CriticalSection) … … 208 257 End Function 209 258 259 /*! 260 @brief メモリオブジェクトを再確保する 261 @param lpMem メモリオブジェクトへのポインタ 262 size メモリオブジェクトのサイズ 263 flags メモリオブジェクトの属性 264 @author Daisuke Yamamoto 265 @date 2007/10/21 266 */ 210 267 Function __realloc(lpMem As VoidPtr, size As SIZE_T) As VoidPtr 211 268 EnterCriticalSection(CriticalSection) … … 226 283 End Function 227 284 285 /*! 286 @brief メモリオブジェクトを解放する 287 @param lpMem メモリオブジェクトへのポインタ 288 isSweeping スウィープ中にこのメソッドが呼ばれるときはTrue、それ以外はFalse 289 @author Daisuke Yamamoto 290 @date 2007/10/21 291 */ 228 292 Sub __free_ex(lpMem As VoidPtr, isSweeping As Boolean) 229 293 EnterCriticalSection(CriticalSection) … … 247 311 End Sub 248 312 313 /*! 314 @brief メモリオブジェクトを解放する 315 @param lpMem メモリオブジェクトへのポインタ 316 @author Daisuke Yamamoto 317 @date 2007/10/21 318 */ 249 319 Sub __free(lpMem As VoidPtr) 250 320 __free_ex( lpMem, False ) 251 321 End Sub 252 322 323 /*! 324 @brief スウィープする 325 @author Daisuke Yamamoto 326 @date 2007/10/21 327 */ 253 328 Sub sweep() 254 329 If isSweeping <> False or (iAllSize<limitMemorySize and n<limitMemoryObjectNum) Then … … 271 346 End Function 272 347 273 ' 生存検知 348 /*! 349 @brief メモリオブジェクトの生存検地 350 @param pSample メモリオブジェクトへのポインタ 351 @author Daisuke Yamamoto 352 @date 2007/10/21 353 */ 274 354 Function HitTest(pSample As VoidPtr) As Long 275 355 Dim i As Long … … 282 362 End Function 283 363 284 ' オブジェクトのスキャン 364 /*! 365 @brief オブジェクトのスキャン 366 @param pObject オブジェクトへのポインタ 367 pbMark マークリスト 368 @author Daisuke Yamamoto 369 @date 2007/10/21 370 */ 285 371 Function ScanObject(pObject As *Object, pbMark As *Byte) As Boolean 286 372 Dim classTypeInfo = Nothing As ActiveBasic.Core._System_TypeForClass … … 305 391 End Function 306 392 307 ' 指定領域のスキャン 393 /*! 394 @brief メモリオブジェクトのスキャン 395 @param pStartPtr メモリオブジェクトへのポインタ 396 maxNum スキャンするメモリオブジェクトの個数 397 pbMark マークリスト 398 @author Daisuke Yamamoto 399 @date 2007/10/21 400 */ 308 401 Sub Scan(pStartPtr As *LONG_PTR, maxNum As Long, pbMark As *Byte) 309 402 Dim i As Long, index As Long … … 337 430 End Sub 338 431 339 ' ローカル領域をルートに指定してスキャン 432 /*! 433 @brief グローバル領域をルートに指定してスキャン 434 @param pbMark マークリスト 435 @author Daisuke Yamamoto 436 @date 2007/10/21 437 */ 438 Sub GlobalScan( pbMark As *Byte ) 439 Dim i As Long 440 For i = 0 To ELM( globalRootNum ) 441 Scan( pGlobalRoots[i].ptr, pGlobalRoots[i].count, pbMark ) 442 Next 443 End Sub 444 445 /*! 446 @brief ローカル領域をルートに指定してスキャン 447 @param pbMark マークリスト 448 @author Daisuke Yamamoto 449 @date 2007/10/21 450 */ 340 451 Sub LocalScan( pbMark As *Byte ) 341 452 Dim Context As CONTEXT … … 377 488 End Sub 378 489 490 /*! 491 @brief 生存していないメモリオブジェクトを解放する 492 @param pbMark マークリスト 493 @author Daisuke Yamamoto 494 @date 2007/10/21 495 */ 379 496 Sub DeleteGarbageMemories( pbMark As *Byte ) 380 497 … … 424 541 End Sub 425 542 543 /*! 544 @brief GCが管理するすべてのメモリオブジェクトを解放する 545 @author Daisuke Yamamoto 546 @date 2007/10/21 547 */ 426 548 Sub DeleteAllGarbageMemories() 427 549 DeleteGarbageMemories( NULL ) 428 550 End Sub 429 551 552 /*! 553 @brief コンパクション 554 @author Daisuke Yamamoto 555 @date 2007/10/21 556 */ 430 557 Sub Compaction() 431 558 Dim i As Long, i2 = 0 As Long … … 442 569 End Sub 443 570 444 ' スウィープ(新規スレッドで呼び出し) 571 /*! 572 @brief スウィープ(新規スレッドで呼び出す必要あり) 573 @author Daisuke Yamamoto 574 @date 2007/10/21 575 */ 445 576 Function SweepOnOtherThread() As Long 446 577 EnterCriticalSection(CriticalSection) … … 464 595 465 596 ' グローバル領域をルートに指定してスキャン 466 Dim i As Long 467 For i = 0 To ELM( globalRootNum ) 468 Scan( pGlobalRoots[i].ptr, pGlobalRoots[i].count, pbMark ) 469 Next 597 GlobalScan( pbMark ) 470 598 471 599 ' ローカル領域をルートに指定してスキャン … … 516 644 End Function 517 645 518 ' 未解放のメモリオブジェクトをトレース 646 /*! 647 @brief 未解放のメモリオブジェクトをデバッグ出力する 648 @author Daisuke Yamamoto 649 @date 2007/10/21 650 */ 519 651 Sub DumpMemoryLeaks() 520 652 Dim isLeak = False
Note:
See TracChangeset
for help on using the changeset viewer.