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

📄 reclaim.c

📁 内存垃圾收集程序
💻 C
字号:
#include <stdio.h>#include "runtime.h"#define DEBUG#undef DEBUG#ifdef PRINTSTATS#  define GATHERSTATS#endiflong mem_found = 0;     /* Number of longwords of memory reclaimed     */long composite_in_use;  /* Number of longwords in accessible composite */			/* objects.                                    */long atomic_in_use;     /* Number of longwords in accessible atomic */			/* objects.                                 *//* * reclaim phase * */reclaim(){register struct hblk *hbp;	/* ptr to current heap block		*/register int word_no;		/* Number of word in block		*/register long i;register word *p;		/* pointer to current word in block	*/register int mb;		/* mark bit of current word		*/int sz;				/* size of objects in current block	*/word *plim;struct hblk **nexthbp;		/* ptr to ptr to current heap block	*/int nonempty;			/* nonempty ^ done with block => block empty*/struct obj *list;		/* used to build list of free words in block*/register int is_atomic;         /* => current block contains atomic objs */#   ifdef DEBUG        printf("clearing all between %x and %x, %x and %x\n",               objfreelist, &objfreelist[MAXOBJSZ+1],               aobjfreelist,&aobjfreelist[MAXAOBJSZ+1]);#   endif    { register struct obj **fop;	for( fop = objfreelist; fop < &objfreelist[MAXOBJSZ+1]; fop++ ) {	    *fop = (struct obj *)0;	}	for( fop = aobjfreelist; fop < &aobjfreelist[MAXAOBJSZ+1]; fop++ ) {	    *fop = (struct obj *)0;	}    }        atomic_in_use = 0;    composite_in_use = 0;#   ifdef PRINTBLOCKS        printf("reclaim: current block sizes:\n");#   endif  /* go through all heap blocks (in hblklist) and reclaim unmarked objects */# ifdef HBLK_MAP    hbp = (struct hblk *) heapstart;    for (; ((char *)hbp) < heaplim; hbp++) if (is_hblk(hbp)) {/* fprintf(stderr, "Reclaiming in 0x%X\n", hbp); */# else    nexthbp = hblklist;    while( nexthbp < last_hblk ) {	hbp = *nexthbp++;# endif	nonempty = FALSE;	sz = hbp -> hb_sz;	is_atomic = 0;	if (sz < 0) {	    sz = -sz;	    is_atomic = 1;		/* this block contains atomic objs */	}#	ifdef PRINTBLOCKS            printf("%d(%c",sz, (is_atomic)? 'a' : 'c');#	endif	if( sz > (is_atomic? MAXAOBJSZ : MAXOBJSZ) ) {  /* 1 big object */	    mb = mark_bit(hbp, (hbp -> hb_body) - ((word *)(hbp)));	    if( mb ) {#               ifdef GATHERSTATS		    if (is_atomic) {			atomic_in_use += sz;		    } else {			composite_in_use += sz;		    }#               endif		nonempty = TRUE;	    } else {		mem_found += sz;	    }	} else {				/* group of smaller objects */	    p = (word *)(hbp->hb_body);	    word_no = ((word *)p) - ((word *)hbp);	    plim = (word *)((((unsigned)hbp) + HBLKSIZE)		       - WORDS_TO_BYTES(sz));	    list = (is_atomic) ? aobjfreelist[sz] : objfreelist[sz];	  /* go through all words in block */	    while( p <= plim )  {		mb = mark_bit(hbp, word_no);		if( mb ) {#                   ifdef GATHERSTATS			if (is_atomic) atomic_in_use += sz;			else           composite_in_use += sz;#                   endif#                   ifdef DEBUG                        printf("found a reachable obj\n");#		    endif		    nonempty = TRUE;		    p += sz;		} else {		  mem_found += sz;		  /* word is available - put on list */		    ((struct obj *)p)->obj_link = list;		    list = ((struct obj *)p);		  if (is_atomic) {		    p += sz;		  } else {		    /* Clear object, advance p to next object in the process */			i = (long)(p + sz);                        p++; /* Skip link field */                        while (p < (word *)i) {			    *p++ = 0;			}		  }		}		word_no += sz;	    }	  /*	   * if block has reachable words in it, we can't reclaim the	   * whole thing so put list of free words in block back on	   * free list for this size.	   */	    if( nonempty ) {		if ( is_atomic )	aobjfreelist[sz] = list;		else			objfreelist[sz] = list;	    }	} #	ifdef PRINTBLOCKS            printf("%c),", nonempty ? 'n' : 'e' );#	endif	if (!nonempty) {            if (!is_atomic && sz <= MAXOBJSZ) {                /* Clear words at beginning of objects */                /* Since most of it is already cleared */		  p = (word *)(hbp->hb_body);		  plim = (word *)((((unsigned)hbp) + HBLKSIZE)			 - WORDS_TO_BYTES(sz));		  while (p <= plim) {		    *p = 0;		    p += sz;		  }		hbp -> hb_uninit = 0;	    } else {		/* Mark it as being uninitialized */		hbp -> hb_uninit = 1;	    }	  /* remove this block from list of active blocks */	    del_hblklist(hbp);	#           ifndef HBLKMAP	      /* This entry in hblklist just got replaced; look at it again  */	      /* This admittedly depends on the internals of del_hblklist... */	      nexthbp--;#           endif	    freehblk(hbp);	}  /* end if (one big object...) */    } /* end while (nexthbp ...) */#   ifdef PRINTBLOCKS        printf("\n");#   endif}

⌨️ 快捷键说明

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