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

📄 macos.c

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 C
字号:
/*	MacOS.c		Some routines for the Macintosh OS port of the Hans-J. Boehm, Alan J. Demers	garbage collector.		<Revision History>		11/22/94  pcb  StripAddress the temporary memory handle for 24-bit mode.	11/30/94  pcb  Tracking all memory usage so we can deallocate it all at once.	02/10/96  pcb  Added routine to perform a final collection whenunloading shared library.		by Patrick C. Beard. *//* Boehm, February 15, 1996 2:55 pm PST */#include <Resources.h>#include <Memory.h>#include <LowMem.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "gc.h"#include "gc_priv.h"// use 'CODE' resource 0 to get exact location of the beginning of global space.typedef struct {	unsigned long aboveA5;	unsigned long belowA5;	unsigned long JTSize;	unsigned long JTOffset;} *CodeZeroPtr, **CodeZeroHandle;void* GC_MacGetDataStart(){	CodeZeroHandle code0 = (CodeZeroHandle)GetResource('CODE', 0);	if (code0) {		long belowA5Size = (**code0).belowA5;		ReleaseResource((Handle)code0);		return (LMGetCurrentA5() - belowA5Size);	}	fprintf(stderr, "Couldn't load the jump table.");	exit(-1);	return 0;}/* track the use of temporary memory so it can be freed all at once. */typedef struct TemporaryMemoryBlock TemporaryMemoryBlock, **TemporaryMemoryHandle;struct TemporaryMemoryBlock {	TemporaryMemoryHandle nextBlock;	char data[];};static TemporaryMemoryHandle theTemporaryMemory = NULL;static Boolean firstTime = true;void GC_MacFreeTemporaryMemory(void);Ptr GC_MacTemporaryNewPtr(size_t size, Boolean clearMemory){	static Boolean firstTime = true;	OSErr result;	TemporaryMemoryHandle tempMemBlock;	Ptr tempPtr = nil;	tempMemBlock = (TemporaryMemoryHandle)TempNewHandle(size + sizeof(TemporaryMemoryBlock), &result);	if (tempMemBlock && result == noErr) {		HLockHi((Handle)tempMemBlock);		tempPtr = (**tempMemBlock).data;		if (clearMemory) memset(tempPtr, 0, size);		tempPtr = StripAddress(tempPtr);		// keep track of the allocated blocks.		(**tempMemBlock).nextBlock = theTemporaryMemory;		theTemporaryMemory = tempMemBlock;	}	#     if !defined(SHARED_LIBRARY_BUILD)	// install an exit routine to clean up the memory used at the end.	if (firstTime) {		atexit(&GC_MacFreeTemporaryMemory);		firstTime = false;	}#     endif		return tempPtr;}extern word GC_fo_entries; static void perform_final_collection(){  unsigned i;  word last_fo_entries = 0;    /* adjust the stack bottom, because CFM calls us from another stack     location. */     GC_stackbottom = (ptr_t)&i;  /* try to collect and finalize everything in sight */    for (i = 0; i < 2 || GC_fo_entries < last_fo_entries; i++) {        last_fo_entries = GC_fo_entries;        GC_gcollect();    }}void GC_MacFreeTemporaryMemory(){# if defined(SHARED_LIBRARY_BUILD)    /* if possible, collect all memory, and invoke all finalizers. */      perform_final_collection();# endif    if (theTemporaryMemory != NULL) {	long totalMemoryUsed = 0;	TemporaryMemoryHandle tempMemBlock = theTemporaryMemory;	while (tempMemBlock != NULL) {		TemporaryMemoryHandle nextBlock = (**tempMemBlock).nextBlock;		totalMemoryUsed += GetHandleSize((Handle)tempMemBlock);		DisposeHandle((Handle)tempMemBlock);		tempMemBlock = nextBlock;	}	theTemporaryMemory = NULL;#       if !defined(SILENT) && !defined(SHARED_LIBRARY_BUILD)          fprintf(stdout, "[total memory used:  %ld bytes.]\n",                  totalMemoryUsed);          fprintf(stdout, "[total collections:  %ld.]\n", GC_gc_no);#       endif    }}#if __option(far_data)  void* GC_MacGetDataEnd()  {	CodeZeroHandle code0 = (CodeZeroHandle)GetResource('CODE', 0);	if (code0) {		long aboveA5Size = (**code0).aboveA5;		ReleaseResource((Handle)code0);		return (LMGetCurrentA5() + aboveA5Size);	}	fprintf(stderr, "Couldn't load the jump table.");	exit(-1);	return 0;  }#endif /* __option(far_data) */

⌨️ 快捷键说明

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