⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 collector.c

📁 This is a java virtual machine implement in c
💻 C
字号:
/*0001*//*
/*0002./ * Copyright (c) 1998-2001 Sun Microsystems, Inc. All Rights Reserved.
/*0003./ *
/*0004./ * This software is the confidential and proprietary information of Sun
/*0005./ * Microsystems, Inc. ("Confidential Information").  You shall not
/*0006./ * disclose such Confidential Information and shall use it only in
/*0007./ * accordance with the terms of the license agreement you entered into
/*0008./ * with Sun.
/*0009./ *
/*0010./ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
/*0011./ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
/*0012./ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
/*0013./ * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
/*0014./ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
/*0015./ * THIS SOFTWARE OR ITS DERIVATIVES.
/*0016./ *
/*0017./ */
/*0018*/
/*0019*//*=========================================================================
/*0020./ * SYSTEM:    KVM
/*0021./ * SUBSYSTEM: Memory management
/*0022./ * FILE:      collector.c
/*0023./ * OVERVIEW:  Exact, compacting garbage collector.
/*0024./ * AUTHOR:    Antero Taivalsaari, Sun Labs
/*0025./ *            Edited by Doug Simon 11/1998 (made collection more precise)
/*0026./ *            Frank Yellin (removed excessive recursion)
/*0027./ *            Frank Yellin, Matt Seidl (exact, compacting GC)
/*0028./ *=======================================================================*/
/*0029*/
/*0030*//*=========================================================================
/*0031./ * For detailed explanation of the memory system, see Garbage.h
/*0032./ *=======================================================================*/
/*0033*/
/*0034*//*=========================================================================
/*0035./ * Include files
/*0036./ *=======================================================================*/
/*0037*/
/*0038*/#include <global.h>
/*0039*/
/*0040*//*=========================================================================
/*0041./ * Definitions and declarations
/*0042./ *=======================================================================*/
/*0043*/
/*0044*/#define PTR_OFFSET(ptr, offset) ((void *)((char *)ptr + offset))
/*0045*/#define PTR_DELTA(ptr1, ptr2) ((char *)(ptr1) - (char *)ptr2)
/*0046*/
/*0047*/#define CELL_AT_OFFSET(ptr, offset) (*(cell *)PTR_OFFSET(ptr, offset))
/*0048*/
/*0049*/#if ENABLE_HEAP_COMPACTION
/*0050*/# define ISKEPT(n) ((n) & MARKBIT)
/*0051*/#else
/*0052*/# define ISKEPT(n) ((n) & (MARKBIT|STATICBIT))
/*0053*/#endif
/*0054*/
/*0055*/typedef struct breakTableStruct {
/*0056*/    int length;                 /* in entries */
/*0057*/    struct breakTableEntryStruct *table;
/*0058*/} breakTableStruct;
/*0059*/
/*0060*/
/*0061*/typedef struct breakTableEntryStruct {
/*0062*/    cell *address;
/*0063*/    int offset;
/*0064*/} breakTableEntryStruct;
/*0065*/
/*0066*//*=========================================================================
/*0067./ * Variables
/*0068./ *=======================================================================*/
/*0069*/
/*0070*/void* TheHeap;
/*0071*/long  VMHeapSize;               /*  Heap size */
/*0072*/
/*0073*/cell* AllHeapStart;             /*  Heap bottom */
/*0074*/cell* CurrentHeap;              /*  Same as AllHeapStart*/
/*0075*/cell* CurrentHeapEnd;           /*  End of heap */
/*0076*/cell* AllHeapEnd;
/*0077*/
/*0078*/WEAKPOINTERLIST WeakPointers;
/*0079*/CHUNK FirstFreeChunk;
/*0080*/
/*0081*/#if ENABLE_HEAP_COMPACTION
/*0082*/cell* PermanentSpaceFreePtr;
/*0083*/#endif
/*0084*/
/*0085*/#define DEFERRED_OBJECT_TABLE_SIZE 40
/*0086*/static cell *deferredObjectTable[DEFERRED_OBJECT_TABLE_SIZE];
/*0087*/#define endDeferredObjectTable (deferredObjectTable + DEFERRED_OBJECT_TABLE_SIZE)
/*0088*/static cell **startDeferredObjects,  **endDeferredObjects;
/*0089*/static int deferredObjectCount;
/*0090*/static int deferredObjectTableOverflow;
/*0091*/
/*0092*//*=========================================================================
/*0093./ * Static functions (private to this file)
/*0094./ *=======================================================================*/
/*0095*/
/*0096*/static void putDeferredObject(cell *c);
/*0097*/static cell* getDeferredObject(void);
/*0098*/static void initializeDeferredObjectTable(void);
/*0099*/static void markChildren(cell* object, cell* limit, int remainingDepth);
/*0100*/static void checkMonitorAndMark(OBJECT object);
/*0101*/
/*0102*/static cell* allocateFreeChunk(long size);
/*0103*/
/*0104*/static CHUNK sweepTheHeap(long *maximumFreeSizeP);
/*0105*/
/*0106*/#if ENABLE_HEAP_COMPACTION
/*0107*/static cell* compactTheHeap(breakTableStruct *currentTable, CHUNK);
/*0108*/
/*0109*/static breakTableEntryStruct*
/*0110*/slideObject(cell* deadSpace, cell *object, int objectSize, int extraSize,
/*0111*/            breakTableEntryStruct *table, int tableLength, int *lastRoll);
/*0112*/
/*0113*/static void sortBreakTable(breakTableEntryStruct *, int length);
/*0114*/static void updateRootObjects(breakTableStruct *currentTable);
/*0115*/static void updateHeapObjects(breakTableStruct *currentTable, cell *endScan);
/*0116*/static void updatePointer(void *address, breakTableStruct *currentTable);
/*0117*/static void updateMonitor(OBJECT object, breakTableStruct *currentTable);
/*0118*/static void updateThreadAndStack(THREAD thread, breakTableStruct *currentTable);
/*0119*/
/*0120*/void printBreakTable(breakTableEntryStruct *table, int length) ;
/*0121*/
/*0122*/#endif /* ENABLE_HEAP_COMPACTION */
/*0123*/
/*0132*/#if ASYNCHRONOUS_NATIVE_FUNCTIONS
/*0133*/#include <async.h>
/*0134*/extern ASYNCIOCB IocbRoots[];
/*0135*/#endif
/*0136*/
/*0137*/static void markRootObjects(void);
/*0138*/static void markNonRootObjects(void);
/*0139*/static void markWeakPointerLists(void);
/*0140*/
/*0141*/static void markThreadStack(THREAD thisThread);
/*0142*/
/*0143*//*=========================================================================
/*0144./ * Helper macros
/*0145./ *=======================================================================*/
/*0146*/
/*0147*/#define OBJECT_HEADER(object) ((cell *)(object))[-HEADERSIZE]
/*0148*/
/*0149*/#define MARK_OBJECT(object) \
/*0150*/    if (inHeapSpaceFast(object)) { OBJECT_HEADER(object) |= MARKBIT; }
/*0151*/
/*0152*/#define MARK_OBJECT_IF_NON_NULL(object) \
/*0153*/    if (inHeapSpaceFast(object)) { OBJECT_HEADER(object) |= MARKBIT; }
/*0154*/
/*0155*/#define inHeapSpaceFast(ptr) \
/*0156*/     (((cell *)ptr >= heapSpace) && ((cell *)ptr < heapSpaceEnd))
/*0157*/
/*0158*//*=========================================================================
/*0159./ * Heap initialization operations
/*0160./ *=======================================================================*/
/*0161*/

		//\\

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -