/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * 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. */ #include "xp.h" #include "layout.h" #ifdef MEMORY_ARENAS #define ARENA_SIZE 16384 void lo_InitializeMemoryArena(lo_TopState *top_state) { lo_arena *aptr; int32 arena_size; top_state->first_arena = NULL; top_state->current_arena = NULL; arena_size = (int32) (ARENA_SIZE + sizeof(lo_arena)); arena_size = ((arena_size + 3) & ~3); aptr = (lo_arena *)XP_ALLOC(arena_size); if (aptr == NULL) { top_state->first_arena = NULL; top_state->current_arena = NULL; return; } #ifdef XP_WIN16 aptr->limit = (char *)((int32)((char *)aptr) + arena_size); aptr->avail = (char *)((int32)((char *)aptr) + (int32)sizeof(lo_arena)); #else aptr->limit = (char *)aptr + arena_size; aptr->avail = (char *)aptr + sizeof(lo_arena); #endif aptr->next = NULL; top_state->first_arena = aptr; top_state->current_arena = aptr; } int32 lo_FreeMemoryArena(lo_arena *arena) { int32 cnt; cnt = 0; while (arena != NULL) { lo_arena *tmp_aptr; tmp_aptr = arena; arena = arena->next; cnt += (int32 )(tmp_aptr->limit - (char *)tmp_aptr); XP_FREE((char *)tmp_aptr); } return(cnt); } char * lo_MemoryArenaAllocate(lo_TopState *top_state, int32 size) { lo_arena *aptr; char *ptr; if ((top_state == NULL)||(top_state->current_arena == NULL)) { return(NULL); } aptr = top_state->current_arena; #ifdef XP_WIN16 while ((int32)((int32)((char *)aptr->avail) + size) > (int32)((char *)aptr->limit)) #else while ((aptr->avail + size) > aptr->limit) #endif { if (aptr->next != NULL) { aptr = aptr->next; #ifdef XP_WIN16 aptr->avail = (char *)((int32)((char *)aptr) + (int32)sizeof(lo_arena)); #else aptr->avail = (char *)aptr + sizeof(lo_arena); #endif } else { int32 arena_size; arena_size = (int32) (ARENA_SIZE + sizeof(lo_arena)); arena_size = ((arena_size + 3) & ~3); aptr->next = (lo_arena *)XP_ALLOC(arena_size); if (aptr->next == NULL) { return(NULL); } aptr = aptr->next; #ifdef XP_WIN16 aptr->limit = (char *)((int32)((char *)aptr) + arena_size); aptr->avail = (char *)((int32)((char *)aptr) + (int32)sizeof(lo_arena)); #else aptr->limit = (char *)aptr + arena_size; aptr->avail = (char *)aptr + sizeof(lo_arena); #endif aptr->next = NULL; } } top_state->current_arena = aptr; ptr = (char *)aptr->avail; #ifdef XP_WIN16 aptr->avail = (char *)((int32)((char *)aptr->avail) + size); #else aptr->avail += size; #endif return(ptr); } #endif /* MEMORY_ARENAS */