[BACK]Return to MacOS.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / gc

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>