pjs/ef/gc/include/smstack.h

113 строки
3.7 KiB
C

/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*******************************************************************************
S P O R T M O D E L
_____
____/_____\____
/__o____o____o__\ __
\_______________/ (@@)/
/\_____|_____/\ x~[]~
~~~~~~~~~~~/~~~~~~~|~~~~~~~\~~~~~~~~/\~~~~~~~~~
Advanced Technology Garbage Collector
Copyright (c) 1997 Netscape Communications, Inc. All rights reserved.
Recovered by: Warren Harris
*******************************************************************************/
#ifndef __SMSTACK__
#define __SMSTACK__
#include "smobj.h"
SM_BEGIN_EXTERN_C
/******************************************************************************/
typedef struct SMStackSegmentHeader {
struct SMStackSegment* prev;
struct SMStackSegment* next;
} SMStackSegmentHeader;
typedef struct SMStackSegment {
SMStackSegmentHeader header;
SMObject* element;
/* multiple elements follow */
} SMStackSegment;
#define SM_STACK_SEG_PAGES 1
typedef struct SMStack {
SMStackSegment* segment;
SMObject** top;
SMObject** min;
SMObject** max;
PRUword overflowCount;
} SMStack;
#define SM_INIT_STACK(stack) \
((stack)->segment = NULL, \
(stack)->top = NULL, \
(stack)->min = NULL, \
(stack)->max = NULL, \
(stack)->overflowCount = 0) \
#define SM_STACK_POP0(stack) \
(*(--(stack)->top)) \
#define SM_STACK_PUSH0(stack, obj) \
((void)(*((stack)->top)++ = (obj))) \
#define SM_STACK_POP(stack) \
(((stack)->top > (stack)->min) \
? SM_STACK_POP0(stack) \
: SM_STACK_UNDERFLOW(stack)) \
#define SM_STACK_PUSH(stack, obj) \
(((stack)->top < (stack)->max) \
? (SM_STACK_PUSH0(stack, obj), PR_TRUE) \
: SM_STACK_OVERFLOW(stack, obj)) \
#define SM_STACK_UNDERFLOW(stack) sm_StackUnderflow(stack)
#define SM_STACK_OVERFLOW(stack, obj) sm_StackOverflow(stack, obj)
#define SM_STACK_IS_EMPTY(stack) \
((stack)->segment == NULL \
|| ((stack)->segment->header.prev == NULL \
&& (stack)->top == (stack)->min)) \
extern SMObject*
sm_StackUnderflow(SMStack* stack);
extern PRBool
sm_StackOverflow(SMStack* stack, SMObject* obj);
extern PRUword
sm_StackSize(SMStack* stack);
extern void
sm_DestroyStack(SMStack* stack);
/******************************************************************************/
SM_END_EXTERN_C
#endif /* __SMSTACK__ */
/******************************************************************************/