gecko-dev/lib/layout/layarena.c

139 строки
3.1 KiB
C

/* -*- 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 */