Back to index

lightning-sunbird  0.9+nobinonly
Defines | Functions | Variables
win32gc.c File Reference
#include <windows.h>
#include "prlog.h"

Go to the source code of this file.


#define GC_VMBASE   0x40000000
#define GC_VMLIMIT   0x00FFFFFF


void _MD_InitGC ()
void_MD_GrowGCHeap (PRUint32 *sizep)
PRBool _MD_ExtendGCHeap (char *base, PRInt32 oldSize, PRInt32 newSize)
void _MD_FreeGCSegment (void *base, PRInt32 len)


voidbaseaddr = (void*) GC_VMBASE
voidlastaddr = (void*) GC_VMBASE

Define Documentation

#define GC_VMBASE   0x40000000

Definition at line 47 of file win32gc.c.

#define GC_VMLIMIT   0x00FFFFFF

Definition at line 48 of file win32gc.c.

Function Documentation

PRBool _MD_ExtendGCHeap ( char *  base,
PRInt32  oldSize,
PRInt32  newSize 

Definition at line 102 of file win32gc.c.

  void* addr;

  addr = VirtualAlloc( base + oldSize, newSize - oldSize,
                     MEM_COMMIT, PAGE_READWRITE );
  if (NULL == addr) {
    PR_LOG(_pr_msgc_lm, PR_LOG_ALWAYS, ("GC: unable to extend heap: LastError=%ld",
    return PR_FALSE;
  if (base + oldSize != (char*)addr) {
    PR_LOG(_pr_msgc_lm, PR_LOG_ALWAYS, ("GC: segment extension returned %x instead of %x",
                   addr, base + oldSize));
    VirtualFree(addr, newSize - oldSize, MEM_DECOMMIT);
    return PR_FALSE;
  lastaddr = base + newSize;
  PR_LOG(_pr_msgc_lm, PR_LOG_ALWAYS,
        ("GC: heap now extends from %p to %p",
         base, base + newSize));
  return PR_TRUE;
void _MD_FreeGCSegment ( void base,
PRInt32  len 

Definition at line 126 of file win32gc.c.

     (void)VirtualFree(base, 0, MEM_RELEASE);
void* _MD_GrowGCHeap ( PRUint32 sizep)

Definition at line 62 of file win32gc.c.

    void *addr;
    size_t size;

    /* Reserve a block of memory for the GC */
    if( lastaddr == baseaddr ) {
        addr = VirtualAlloc( (void *)GC_VMBASE, GC_VMLIMIT, MEM_RESERVE, PAGE_READWRITE );

        ** If the GC_VMBASE address is already mapped, then let the OS choose a 
        ** base address that is available...
        if (addr == NULL) {
            addr = VirtualAlloc( NULL, GC_VMLIMIT, MEM_RESERVE, PAGE_READWRITE );

            baseaddr = lastaddr = addr;
            if (addr == NULL) {
                PR_LOG(_pr_msgc_lm, PR_LOG_ALWAYS, ("GC: unable to allocate heap: LastError=%ld",
                return 0;
    size = *sizep;

    /* Extend the mapping */
    addr = VirtualAlloc( lastaddr, size, MEM_COMMIT, PAGE_READWRITE );
    if (addr == NULL) {
        return 0;

    lastaddr = ((char*)addr + size);
    PR_LOG(_pr_msgc_lm, PR_LOG_ALWAYS,
          ("GC: heap extends from %08x to %08x",
           baseaddr, (long)baseaddr + (char*)lastaddr - (char*)baseaddr));

    return addr;

Here is the caller graph for this function:

Definition at line 60 of file win32gc.c.


Here is the caller graph for this function:

Variable Documentation

Definition at line 78 of file prmsgc.c.

Definition at line 57 of file win32gc.c.

Definition at line 58 of file win32gc.c.