1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-01-17 08:33:48 +00:00
Interlisp.maiko/src/gcoflow.c
Nick Briggs 6603957a0b Move extern declaration for IOINTERRUPTFLAGS_word to lspglob.h and remove from initsout.c
Initialize MaxTypeNumber_word from address of value cell of \MaxTypeNumber in initsout.c
Correctly extract value of \MaxTypeNumber where used in gcmaptable() (though gcmaptable() itself is unused at this time)
Update GetDTD() macro to return (void *), result will be cast to (struct dtd *) where it is needed.  Alignment should always be sufficiently large.
2023-02-17 17:01:27 -08:00

103 lines
3.9 KiB
C

/* $Id: gcoflow.c,v 1.3 1999/05/31 23:35:32 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved
*/
/************************************************************************/
/* */
/* (C) Copyright 1989-95 Venue. All Rights Reserved. */
/* Manufactured in the United States of America. */
/* */
/*************************************************************************/
/* */
/* File Name : gcpunt.c */
/* */
/*************************************************************************/
/* */
/* Creation Date : July-8-1987 */
/* Written by Tomoru Teruuchi */
/* */
/*************************************************************************/
/* */
/* Functions : gc_handleoverflow(arg); */
/* gcmaptable(arg); */
/* */
/*************************************************************************/
/* Description : */
/* */
/*************************************************************************/
/* \Tomtom */
/*************************************************************************/
#include "version.h"
#include "arith.h" // for GetSmalldata
#include "gcdata.h" // for htoverflow, REC_GCLOOKUP
#include "gcoflowdefs.h" // for gc_handleoverflow, gcmaptable
#include "gcrdefs.h" // for doreclaim
#include "lispemul.h" // for NIL, DLword, LispPTR
#include "lspglob.h" // for Reclaim_cnt_word, HToverflow, MaxTypeNumber_word
#include "lsptypes.h" // for dtd, GetDTD, TYPE_LISTP
#define Increment_Allocation_Count(n) \
do { \
if (*Reclaim_cnt_word != NIL) { \
if (*Reclaim_cnt_word > (n)) \
(*Reclaim_cnt_word) -= (n); \
else { \
*Reclaim_cnt_word = NIL; \
doreclaim(); \
} \
} \
} while (0)
DLword gc_handleoverflow(DLword arg) {
struct htoverflow *cell;
struct dtd *ptr;
LispPTR cellcnt;
LispPTR addr;
cell = (struct htoverflow *)HToverflow;
/* This proc. protected from interrupt */
while ((addr = cell->ptr) != NIL) {
REC_GCLOOKUP(addr, cell->pcase);
cell->ptr = 0;
cell->pcase = 0;
++cell; /* (\ADDBASE CELL WORDSPERCELL) */
}
ptr = (struct dtd *)GetDTD(TYPE_LISTP);
/* same as "extern struct dtd *ListpDTD" */
if ((cellcnt = ptr->dtd_cnt0) > 1024) {
Increment_Allocation_Count(cellcnt);
ptr->dtd_oldcnt += cellcnt;
ptr->dtd_cnt0 = 0;
}
return (arg);
}
DLword gcmaptable(DLword arg) {
struct htoverflow *cell;
struct dtd *ptr;
LispPTR cellcnt;
int typnum;
LispPTR addr;
int maxtypenumber = GetSmalldata(*MaxTypeNumber_word);
cell = (struct htoverflow *)HToverflow;
/* This proc. protected from interrupt */
while ((addr = cell->ptr) != NIL) {
REC_GCLOOKUP(addr, cell->pcase);
cell->ptr = 0;
cell->pcase = 0;
++cell; /* (\ADDBASE CELL WORDSPERCELL) */
}
for (typnum = 1; typnum <= maxtypenumber; ++typnum)
/* applied alltype */
{
ptr = (struct dtd *)GetDTD(typnum);
if ((cellcnt = ptr->dtd_cnt0) != 0) {
ptr->dtd_oldcnt += cellcnt;
ptr->dtd_cnt0 = 0;
Increment_Allocation_Count(cellcnt);
}
}
return (arg);
}