Index: third_party/nspr/mozilla/nsprpub/lib/msgc/include/prgc.h |
diff --git a/third_party/nspr/mozilla/nsprpub/lib/msgc/include/prgc.h b/third_party/nspr/mozilla/nsprpub/lib/msgc/include/prgc.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..859f7b1c0dd5465f7c2535f9a23440e988f3f715 |
--- /dev/null |
+++ b/third_party/nspr/mozilla/nsprpub/lib/msgc/include/prgc.h |
@@ -0,0 +1,419 @@ |
+/* -*- 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___ */ |