Annotation of OpenXM_contrib2/asir2000/gc/MacOS.c, Revision 1.1
1.1 ! noro 1: /*
! 2: MacOS.c
! 3:
! 4: Some routines for the Macintosh OS port of the Hans-J. Boehm, Alan J. Demers
! 5: garbage collector.
! 6:
! 7: <Revision History>
! 8:
! 9: 11/22/94 pcb StripAddress the temporary memory handle for 24-bit mode.
! 10: 11/30/94 pcb Tracking all memory usage so we can deallocate it all at once.
! 11: 02/10/96 pcb Added routine to perform a final collection when
! 12: unloading shared library.
! 13:
! 14: by Patrick C. Beard.
! 15: */
! 16: /* Boehm, February 15, 1996 2:55 pm PST */
! 17:
! 18: #include <Resources.h>
! 19: #include <Memory.h>
! 20: #include <LowMem.h>
! 21: #include <stdio.h>
! 22: #include <stdlib.h>
! 23: #include <string.h>
! 24:
! 25: #include "gc.h"
! 26: #include "gc_priv.h"
! 27:
! 28: // use 'CODE' resource 0 to get exact location of the beginning of global space.
! 29:
! 30: typedef struct {
! 31: unsigned long aboveA5;
! 32: unsigned long belowA5;
! 33: unsigned long JTSize;
! 34: unsigned long JTOffset;
! 35: } *CodeZeroPtr, **CodeZeroHandle;
! 36:
! 37: void* GC_MacGetDataStart()
! 38: {
! 39: CodeZeroHandle code0 = (CodeZeroHandle)GetResource('CODE', 0);
! 40: if (code0) {
! 41: long belowA5Size = (**code0).belowA5;
! 42: ReleaseResource((Handle)code0);
! 43: return (LMGetCurrentA5() - belowA5Size);
! 44: }
! 45: fprintf(stderr, "Couldn't load the jump table.");
! 46: exit(-1);
! 47: return 0;
! 48: }
! 49:
! 50: /* track the use of temporary memory so it can be freed all at once. */
! 51:
! 52: typedef struct TemporaryMemoryBlock TemporaryMemoryBlock, **TemporaryMemoryHandle;
! 53:
! 54: struct TemporaryMemoryBlock {
! 55: TemporaryMemoryHandle nextBlock;
! 56: char data[];
! 57: };
! 58:
! 59: static TemporaryMemoryHandle theTemporaryMemory = NULL;
! 60: static Boolean firstTime = true;
! 61:
! 62: void GC_MacFreeTemporaryMemory(void);
! 63:
! 64: Ptr GC_MacTemporaryNewPtr(size_t size, Boolean clearMemory)
! 65: {
! 66: static Boolean firstTime = true;
! 67: OSErr result;
! 68: TemporaryMemoryHandle tempMemBlock;
! 69: Ptr tempPtr = nil;
! 70:
! 71: tempMemBlock = (TemporaryMemoryHandle)TempNewHandle(size + sizeof(TemporaryMemoryBlock), &result);
! 72: if (tempMemBlock && result == noErr) {
! 73: HLockHi((Handle)tempMemBlock);
! 74: tempPtr = (**tempMemBlock).data;
! 75: if (clearMemory) memset(tempPtr, 0, size);
! 76: tempPtr = StripAddress(tempPtr);
! 77:
! 78: // keep track of the allocated blocks.
! 79: (**tempMemBlock).nextBlock = theTemporaryMemory;
! 80: theTemporaryMemory = tempMemBlock;
! 81: }
! 82:
! 83: # if !defined(SHARED_LIBRARY_BUILD)
! 84: // install an exit routine to clean up the memory used at the end.
! 85: if (firstTime) {
! 86: atexit(&GC_MacFreeTemporaryMemory);
! 87: firstTime = false;
! 88: }
! 89: # endif
! 90:
! 91: return tempPtr;
! 92: }
! 93:
! 94: extern word GC_fo_entries;
! 95:
! 96: static void perform_final_collection()
! 97: {
! 98: unsigned i;
! 99: word last_fo_entries = 0;
! 100:
! 101: /* adjust the stack bottom, because CFM calls us from another stack
! 102: location. */
! 103: GC_stackbottom = (ptr_t)&i;
! 104:
! 105: /* try to collect and finalize everything in sight */
! 106: for (i = 0; i < 2 || GC_fo_entries < last_fo_entries; i++) {
! 107: last_fo_entries = GC_fo_entries;
! 108: GC_gcollect();
! 109: }
! 110: }
! 111:
! 112:
! 113: void GC_MacFreeTemporaryMemory()
! 114: {
! 115: # if defined(SHARED_LIBRARY_BUILD)
! 116: /* if possible, collect all memory, and invoke all finalizers. */
! 117: perform_final_collection();
! 118: # endif
! 119:
! 120: if (theTemporaryMemory != NULL) {
! 121: long totalMemoryUsed = 0;
! 122: TemporaryMemoryHandle tempMemBlock = theTemporaryMemory;
! 123: while (tempMemBlock != NULL) {
! 124: TemporaryMemoryHandle nextBlock = (**tempMemBlock).nextBlock;
! 125: totalMemoryUsed += GetHandleSize((Handle)tempMemBlock);
! 126: DisposeHandle((Handle)tempMemBlock);
! 127: tempMemBlock = nextBlock;
! 128: }
! 129: theTemporaryMemory = NULL;
! 130:
! 131: # if !defined(SILENT) && !defined(SHARED_LIBRARY_BUILD)
! 132: fprintf(stdout, "[total memory used: %ld bytes.]\n",
! 133: totalMemoryUsed);
! 134: fprintf(stdout, "[total collections: %ld.]\n", GC_gc_no);
! 135: # endif
! 136: }
! 137: }
! 138:
! 139: #if __option(far_data)
! 140:
! 141: void* GC_MacGetDataEnd()
! 142: {
! 143: CodeZeroHandle code0 = (CodeZeroHandle)GetResource('CODE', 0);
! 144: if (code0) {
! 145: long aboveA5Size = (**code0).aboveA5;
! 146: ReleaseResource((Handle)code0);
! 147: return (LMGetCurrentA5() + aboveA5Size);
! 148: }
! 149: fprintf(stderr, "Couldn't load the jump table.");
! 150: exit(-1);
! 151: return 0;
! 152: }
! 153:
! 154: #endif /* __option(far_data) */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>