/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is the Netscape Portable Runtime (NSPR).
 *
 * The Initial Developer of the Original Code is
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 1998-2000
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

#ifndef prgc_h___
#define prgc_h___

/*
** API to NSPR gc memory system.
*/
#include "prtypes.h"
#include "prmon.h"
#include "prthread.h"
#include <stdio.h>

#if defined(WIN16)
#define GCPTR __far
#else
#define GCPTR
#endif


PR_BEGIN_EXTERN_C

/*
** Initialize the garbage collector.
**     "flags" is the trace flags (see below).
**     "initialHeapSize" is the initial size of the heap and may be zero
**        if the default is desired.
**    "segmentSize" is the size of each segment of memory added to the
**       heap when the heap is grown.
*/
PR_EXTERN(void) PR_InitGC(
    PRWord flags, PRInt32 initialHeapSize, PRInt32 segmentSize, PRThreadScope scope);

/*
** Shuts down gc and frees up all memory associated with it. 
*/
PR_EXTERN(void) PR_ShutdownGC(PRBool finalizeOnExit);

/*
** This walk function will be called for every gc object in the
** heap as it is walked. If it returns non-zero, the walk is terminated.
*/
typedef PRInt32 (*PRWalkFun)(void GCPTR* obj, void* data);

/*
** GC Type record. This defines all of the GC operations used on a
** particular object type. These structures are passed to
** PR_RegisterType.
*/
typedef struct GCType {
    /*
    ** Scan an object that is in the GC heap and call GCInfo.livePointer
    ** on all of the pointers in it. If this slot is null then the object
    ** won't be scanned (i.e. it has no embedded pointers).
    */
    void (PR_CALLBACK *scan)(void GCPTR *obj);

    /*
    ** Finalize an object that has no references. This is called by the
    ** GC after it has determined where the object debris is but before
    ** it has moved the debris to the logical "free list". The object is
    ** marked alive for this call and removed from the list of objects
    ** that need finalization (finalization only happens once for an
    ** object). If this slot is null then the object doesn't need
    ** finalization.
    */
    void (PR_CALLBACK *finalize)(void GCPTR *obj);

    /*
    ** Dump out an object during a PR_DumpGCHeap(). This is used as a
    ** debugging tool.
    */
    void (PR_CALLBACK *dump)(FILE *out, void GCPTR *obj, PRBool detailed, PRIntn indentLevel);

    /*
    ** Add object to summary table.
    */
    void (PR_CALLBACK *summarize)(void GCPTR *obj, PRUint32 bytes);

    /*
    ** Free hook called by GC when the object is being freed.
    */
    void (PR_CALLBACK *free)(void *obj);

    /* Weak pointer support: If the object has a weak pointer (Note:
       at most one), this function is used to get the weak link's
       offset from the start of the body of a gc object */
    PRUint32 (PR_CALLBACK *getWeakLinkOffset)(void *obj);

    /* Descriptive character for dumping this GCType */
    char kindChar;

    /*
    ** Walker routine. This routine should apply fun(obj->ptr, data)
    ** for every gc pointer within the object.
    */
    PRInt32 (PR_CALLBACK *walk)(void GCPTR *obj, PRWalkFun fun, void* data);
} GCType;

/*
** This data structure must be added as the hash table passed to 
** the summarize method of GCType.
*/ 
typedef struct PRSummaryEntry {
    void* clazz;
    PRInt32 instancesCount;
    PRInt32 totalSize;
} PRSummaryEntry;

/*
** This function pointer must be registered by users of nspr
** to produce the finally summary after all object in the
** heap have been visited.
*/
typedef void (PR_CALLBACK *PRSummaryPrinter)(FILE *out, void* closure);

PR_EXTERN(void) PR_CALLBACK PR_RegisterSummaryPrinter(PRSummaryPrinter fun, void* closure);

typedef void PR_CALLBACK GCRootFinder(void *arg);
typedef void PR_CALLBACK GCBeginFinalizeHook(void *arg);
typedef void PR_CALLBACK GCEndFinalizeHook(void *arg);
typedef void PR_CALLBACK GCBeginGCHook(void *arg);
typedef void PR_CALLBACK GCEndGCHook(void *arg);

typedef enum { PR_GCBEGIN, PR_GCEND } GCLockHookArg;

typedef void PR_CALLBACK GCLockHookFunc(GCLockHookArg arg1, void *arg2);

typedef struct GCLockHook GCLockHook;

struct GCLockHook {
  GCLockHookFunc* func;
  void* arg;
  GCLockHook* next;
  GCLockHook* prev;
};


/*
** Hooks which are called at the beginning and end of the GC process.
** The begin hooks are called before the root finding step. The hooks are
** called with threading disabled, so it is now allowed to re-enter the
** kernel. The end hooks are called after the gc has finished but before
** the finalizer has run.
*/
PR_EXTERN(void) PR_CALLBACK PR_SetBeginGCHook(GCBeginGCHook *hook, void *arg);
PR_EXTERN(void) PR_CALLBACK PR_GetBeginGCHook(GCBeginGCHook **hook, void **arg);
PR_EXTERN(void) PR_CALLBACK PR_SetEndGCHook(GCBeginGCHook *hook, void *arg);
PR_EXTERN(void) PR_CALLBACK PR_GetEndGCHook(GCEndGCHook **hook, void **arg);

/*
** Called before SuspendAll is called by dogc, so that GC thread can hold
** all the locks before hand to avoid any deadlocks
*/

/*
PR_EXTERN(void) PR_SetGCLockHook(GCLockHook *hook, void *arg);
PR_EXTERN(void) PR_GetGCLockHook(GCLockHook **hook, void **arg);
*/

PR_EXTERN(int) PR_RegisterGCLockHook(GCLockHookFunc *hook, void *arg);

/*
** Hooks which are called at the beginning and end of the GC finalization
** process. After the GC has identified all of the dead objects in the
** heap, it looks for objects that need finalization. Before it calls the
** first finalization proc (see the GCType structure above) it calls the
** begin hook. When it has finalized the last object it calls the end
** hook.
*/
PR_EXTERN(void) PR_SetBeginFinalizeHook(GCBeginFinalizeHook *hook, void *arg);
PR_EXTERN(void) PR_GetBeginFinalizeHook(GCBeginFinalizeHook **hook, void **arg);
PR_EXTERN(void) PR_SetEndFinalizeHook(GCBeginFinalizeHook *hook, void *arg);
PR_EXTERN(void) PR_GetEndFinalizeHook(GCEndFinalizeHook **hook, void **arg);

/*
** Register a GC type. Return's the index into the GC internal type
** table. The returned value is passed to PR_AllocMemory. After the call,
** the "type" memory belongs to the GC (the caller must not free it or
** change it).
*/
PR_EXTERN(PRInt32) PR_RegisterType(GCType *type);

/*
** Register a root finder with the collector. The collector will call
** these functions to identify all of the roots before collection
** proceeds. "arg" is passed to the function when it is called.
*/
PR_EXTERN(PRStatus) PR_RegisterRootFinder(GCRootFinder func, char *name, void *arg);

/*
** Allocate some GC'able memory. The object must be at least bytes in
** size. The type index function for the object is specified. "flags"
** specifies some control flags. If PR_ALLOC_CLEAN is set then the memory
** is zero'd before being returned. If PR_ALLOC_DOUBLE is set then the
** allocated memory is double aligned.
**
** Any memory cell that you store a pointer to something allocated by
** this call must be findable by the GC. Use the PR_RegisterRootFinder to
** register new places where the GC will look for pointers into the heap.
** The GC already knows how to scan any NSPR threads or monitors.
*/
PR_EXTERN(PRWord GCPTR *)PR_AllocMemory(
    PRWord bytes, PRInt32 typeIndex, PRWord flags);
PR_EXTERN(PRWord GCPTR *)PR_AllocSimpleMemory(
    PRWord bytes, PRInt32 typeIndex);

/*
** This function can be used to cause PR_AllocMemory to always return
** NULL. This may be useful in low memory situations when we're trying to
** shutdown applets.
*/
PR_EXTERN(void) PR_EnableAllocation(PRBool yesOrNo);

/* flags bits */
#define PR_ALLOC_CLEAN 0x1
#define PR_ALLOC_DOUBLE 0x2
#define PR_ALLOC_ZERO_HANDLE 0x4              /* XXX yes, it's a hack */

/*
** Force a garbage collection right now. Return when it completes.
*/
PR_EXTERN(void) PR_GC(void);

/*
** Force a finalization right now. Return when finalization has
** completed. Finalization completes when there are no more objects
** pending finalization. This does not mean there are no objects in the
** gc heap that will need finalization should a collection be done after
** this call.
*/
PR_EXTERN(void) PR_ForceFinalize(void);

/*
** Dump the GC heap out to the given file. This will stop the system dead
** in its tracks while it is occuring.
*/
PR_EXTERN(void) PR_DumpGCHeap(FILE *out, PRBool detailed);

/*
** Wrapper for PR_DumpGCHeap
*/
PR_EXTERN(void) PR_DumpMemory(PRBool detailed);

/*
** Dump summary of objects allocated.
*/
PR_EXTERN(void) PR_DumpMemorySummary(void);

/*
** Dump the application heaps.
*/
PR_EXTERN(void) PR_DumpApplicationHeaps(void);

/*
** Helper function used by dump routines to do the indentation in a
** consistent fashion.
*/
PR_EXTERN(void) PR_DumpIndent(FILE *out, PRIntn indent);

/*
** The GCInfo structure contains all of the GC state...
**
** busyMemory:
**    The amount of GC heap memory that is busy at this instant. Busy
**    doesn't mean alive, it just means that it has been
**    allocated. Immediately after a collection busy means how much is
**    alive.
**
** freeMemory:
**    The amount of GC heap memory that is as yet unallocated.
**
** allocMemory:
**    The sum of free and busy memory in the GC heap.
**
** maxMemory:
**    The maximum size that the GC heap is allowed to grow.
**
** lowSeg:
**    The lowest segment currently used in the GC heap.
**
** highSeg:
**    The highest segment currently used in the GC heap.  
**    The lowSeg and highSeg members are used for a "quick test" of whether 
**    a pointer falls within the GC heap. [ see GC_IN_HEAP(...) ]
**
** lock:
**    Monitor used for synchronization within the GC.
**
** finalizer:
**    Thread in which the GC finalizer is running.
**
** liveBlock:
**    Object scanning functions call through this function pointer to
**    register a potential block of pointers with the collector. (This is
**    currently not at all different than processRoot.)
**
** livePointer:
**    Object scanning functions call through this function pointer to
**    register a single pointer with the collector.
**
** processRootBlock:
**    When a root finder identifies a root it should call through this
**    function pointer so that the GC can process the root. The call takes
**    a base address and count which the gc will examine for valid heap
**    pointers.
**
** processRootPointer:
**    When a root finder identifies a root it should call through this
**    function pointer so that the GC can process the root. The call takes
**    a single pointer value.
*/
typedef struct GCInfoStr {
    PRWord  flags;         /* trace flags (see below)               */
    PRWord  busyMemory;    /* memory in use right now               */
    PRWord  freeMemory;    /* memory free right now                 */
    PRWord  allocMemory;   /* sum of busy & free memory             */
    PRWord  maxMemory;     /* max memory we are allowed to allocate */
    PRWord *lowSeg;        /* lowest segment in the GC heap         */
    PRWord *highSeg;       /* highest segment in the GC heap         */

    PRMonitor *lock;
    PRThread  *finalizer;

    void (PR_CALLBACK *liveBlock)(void **base, PRInt32 count);
    void (PR_CALLBACK *livePointer)(void *ptr);
    void (PR_CALLBACK *processRootBlock)(void **base, PRInt32 count);
    void (PR_CALLBACK *processRootPointer)(void *ptr);
    FILE* dumpOutput;
#ifdef GCTIMINGHOOK
    void (*gcTimingHook)(int32 gcTime);
#endif
} GCInfo;

PR_EXTERN(GCInfo *) PR_GetGCInfo(void);
PR_EXTERN(PRBool) PR_GC_In_Heap(void GCPTR *object);

/*
** Simple bounds check to see if a pointer is anywhere near the GC heap.
** Used to avoid calls to PR_ProcessRoot and GCInfo.livePointer by object
** scanning code.
*/
#if !defined(XP_PC) || defined(_WIN32)
#define GC_IN_HEAP(_info, _p) (((PRWord*)(_p) >= (_info)->lowSeg) && \
                               ((PRWord*)(_p) <  (_info)->highSeg))
#else
/*
** The simple bounds check, above, doesn't work in Win16, because we don't
** maintain: lowSeg == MIN(all segments) and highSeg == MAX(all segments).
** So we have to do a little better.
*/
#define GC_IN_HEAP(_info, _p) PR_GC_In_Heap(_p)
#endif

PR_EXTERN(PRWord) PR_GetObjectHeader(void *ptr);

PR_EXTERN(PRWord) PR_SetObjectHeader(void *ptr, PRWord newUserBits);

/************************************************************************/

/* Trace flags (passed to PR_InitGC or in environment GCLOG) */
#define GC_TRACE    0x0001
#define GC_ROOTS    0x0002
#define GC_LIVE     0x0004
#define GC_ALLOC    0x0008
#define GC_MARK     0x0010
#define GC_SWEEP    0x0020
#define GC_DEBUG    0x0040
#define GC_FINAL    0x0080

#if defined(DEBUG_kipp) || defined(DEBUG_warren)
#define GC_CHECK    0x0100
#endif

#ifdef DEBUG
#define GCTRACE(x, y) if (PR_GetGCInfo()->flags & x) GCTrace y
PR_EXTERN(void) GCTrace(char *fmt, ...);
#else
#define GCTRACE(x, y)
#endif

PR_END_EXTERN_C

#endif /* prgc_h___ */
