Annotation of sbbs/include/mozilla/js/jsgc.h, revision 1.1

1.1     ! root        1: /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
        !             2:  *
        !             3:  * ***** BEGIN LICENSE BLOCK *****
        !             4:  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
        !             5:  *
        !             6:  * The contents of this file are subject to the Mozilla Public License Version
        !             7:  * 1.1 (the "License"); you may not use this file except in compliance with
        !             8:  * the License. You may obtain a copy of the License at
        !             9:  * http://www.mozilla.org/MPL/
        !            10:  *
        !            11:  * Software distributed under the License is distributed on an "AS IS" basis,
        !            12:  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
        !            13:  * for the specific language governing rights and limitations under the
        !            14:  * License.
        !            15:  *
        !            16:  * The Original Code is Mozilla Communicator client code, released
        !            17:  * March 31, 1998.
        !            18:  *
        !            19:  * The Initial Developer of the Original Code is
        !            20:  * Netscape Communications Corporation.
        !            21:  * Portions created by the Initial Developer are Copyright (C) 1998
        !            22:  * the Initial Developer. All Rights Reserved.
        !            23:  *
        !            24:  * Contributor(s):
        !            25:  *
        !            26:  * Alternatively, the contents of this file may be used under the terms of
        !            27:  * either of the GNU General Public License Version 2 or later (the "GPL"),
        !            28:  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
        !            29:  * in which case the provisions of the GPL or the LGPL are applicable instead
        !            30:  * of those above. If you wish to allow use of your version of this file only
        !            31:  * under the terms of either the GPL or the LGPL, and not to allow others to
        !            32:  * use your version of this file under the terms of the MPL, indicate your
        !            33:  * decision by deleting the provisions above and replace them with the notice
        !            34:  * and other provisions required by the GPL or the LGPL. If you do not delete
        !            35:  * the provisions above, a recipient may use your version of this file under
        !            36:  * the terms of any one of the MPL, the GPL or the LGPL.
        !            37:  *
        !            38:  * ***** END LICENSE BLOCK ***** */
        !            39: 
        !            40: #ifndef jsgc_h___
        !            41: #define jsgc_h___
        !            42: /*
        !            43:  * JS Garbage Collector.
        !            44:  */
        !            45: #include "jsprvtd.h"
        !            46: #include "jspubtd.h"
        !            47: #include "jsdhash.h"
        !            48: 
        !            49: JS_BEGIN_EXTERN_C
        !            50: 
        !            51: /* GC thing type indexes. */
        !            52: #define GCX_OBJECT              0               /* JSObject */
        !            53: #define GCX_STRING              1               /* JSString */
        !            54: #define GCX_DOUBLE              2               /* jsdouble */
        !            55: #define GCX_MUTABLE_STRING      3               /* JSString that's mutable --
        !            56:                                                    single-threaded only! */
        !            57: #define GCX_EXTERNAL_STRING     4               /* JSString w/ external chars */
        !            58: #define GCX_NTYPES_LOG2         3               /* type index bits */
        !            59: #define GCX_NTYPES              JS_BIT(GCX_NTYPES_LOG2)
        !            60: 
        !            61: /* GC flag definitions, must fit in 8 bits (type index goes in the low bits). */
        !            62: #define GCF_TYPEMASK    JS_BITMASK(GCX_NTYPES_LOG2)
        !            63: #define GCF_MARK        JS_BIT(GCX_NTYPES_LOG2)
        !            64: #define GCF_FINAL       JS_BIT(GCX_NTYPES_LOG2 + 1)
        !            65: #define GCF_LOCKSHIFT   (GCX_NTYPES_LOG2 + 2)   /* lock bit shift and mask */
        !            66: #define GCF_LOCKMASK    (JS_BITMASK(8 - GCF_LOCKSHIFT) << GCF_LOCKSHIFT)
        !            67: #define GCF_LOCK        JS_BIT(GCF_LOCKSHIFT)   /* lock request bit in API */
        !            68: 
        !            69: /* Pseudo-flag that modifies GCX_STRING to make GCX_MUTABLE_STRING. */
        !            70: #define GCF_MUTABLE     2
        !            71: 
        !            72: #if (GCX_STRING | GCF_MUTABLE) != GCX_MUTABLE_STRING
        !            73: # error "mutable string type index botch!"
        !            74: #endif
        !            75: 
        !            76: extern uint8 *
        !            77: js_GetGCThingFlags(void *thing);
        !            78: 
        !            79: /* These are compatible with JSDHashEntryStub. */
        !            80: struct JSGCRootHashEntry {
        !            81:     JSDHashEntryHdr hdr;
        !            82:     void            *root;
        !            83:     const char      *name;
        !            84: };
        !            85: 
        !            86: struct JSGCLockHashEntry {
        !            87:     JSDHashEntryHdr hdr;
        !            88:     const JSGCThing *thing;
        !            89:     uint32          count;
        !            90: };
        !            91: 
        !            92: #if 1
        !            93: /*
        !            94:  * Since we're forcing a GC from JS_GC anyway, don't bother wasting cycles
        !            95:  * loading oldval.  XXX remove implied force, fix jsinterp.c's "second arg
        !            96:  * ignored", etc.
        !            97:  */
        !            98: #define GC_POKE(cx, oldval) ((cx)->runtime->gcPoke = JS_TRUE)
        !            99: #else
        !           100: #define GC_POKE(cx, oldval) ((cx)->runtime->gcPoke = JSVAL_IS_GCTHING(oldval))
        !           101: #endif
        !           102: 
        !           103: extern intN
        !           104: js_ChangeExternalStringFinalizer(JSStringFinalizeOp oldop,
        !           105:                                  JSStringFinalizeOp newop);
        !           106: 
        !           107: extern JSBool
        !           108: js_InitGC(JSRuntime *rt, uint32 maxbytes);
        !           109: 
        !           110: extern void
        !           111: js_FinishGC(JSRuntime *rt);
        !           112: 
        !           113: extern JSBool
        !           114: js_AddRoot(JSContext *cx, void *rp, const char *name);
        !           115: 
        !           116: extern JSBool
        !           117: js_AddRootRT(JSRuntime *rt, void *rp, const char *name);
        !           118: 
        !           119: extern JSBool
        !           120: js_RemoveRoot(JSRuntime *rt, void *rp);
        !           121: 
        !           122: extern void *
        !           123: js_AllocGCThing(JSContext *cx, uintN flags);
        !           124: 
        !           125: extern JSBool
        !           126: js_LockGCThing(JSContext *cx, void *thing);
        !           127: 
        !           128: extern JSBool
        !           129: js_LockGCThingRT(JSRuntime *rt, void *thing);
        !           130: 
        !           131: extern JSBool
        !           132: js_UnlockGCThingRT(JSRuntime *rt, void *thing);
        !           133: 
        !           134: extern JSBool 
        !           135: js_IsAboutToBeFinalized(JSContext *cx, void *thing);
        !           136: 
        !           137: extern void
        !           138: js_MarkAtom(JSContext *cx, JSAtom *atom, void *arg);
        !           139: 
        !           140: /* We avoid a large number of unnecessary calls by doing the flag check first */
        !           141: #define GC_MARK_ATOM(cx, atom, arg)                                           \
        !           142:     JS_BEGIN_MACRO                                                            \
        !           143:         if (!((atom)->flags & ATOM_MARK))                                     \
        !           144:             js_MarkAtom(cx, atom, arg);                                       \
        !           145:     JS_END_MACRO
        !           146: 
        !           147: extern void
        !           148: js_MarkGCThing(JSContext *cx, void *thing, void *arg);
        !           149: 
        !           150: #ifdef GC_MARK_DEBUG
        !           151: 
        !           152: typedef struct GCMarkNode GCMarkNode;
        !           153: 
        !           154: struct GCMarkNode {
        !           155:     void        *thing;
        !           156:     const char  *name;
        !           157:     GCMarkNode  *next;
        !           158:     GCMarkNode  *prev;
        !           159: };
        !           160: 
        !           161: #define GC_MARK(cx_, thing_, name_, prev_)                                    \
        !           162:     JS_BEGIN_MACRO                                                            \
        !           163:         GCMarkNode node_;                                                     \
        !           164:         node_.thing = thing_;                                                 \
        !           165:         node_.name  = name_;                                                  \
        !           166:         node_.next  = NULL;                                                   \
        !           167:         node_.prev  = prev_;                                                  \
        !           168:         if (prev_) ((GCMarkNode *)(prev_))->next = &node_;                    \
        !           169:         js_MarkGCThing(cx_, thing_, &node_);                                  \
        !           170:     JS_END_MACRO
        !           171: 
        !           172: #else  /* !GC_MARK_DEBUG */
        !           173: 
        !           174: #define GC_MARK(cx, thing, name, prev)   js_MarkGCThing(cx, thing, NULL)
        !           175: 
        !           176: #endif /* !GC_MARK_DEBUG */
        !           177: 
        !           178: /*
        !           179:  * Flags to modify how a GC marks and sweeps:
        !           180:  *   GC_KEEP_ATOMS      Don't sweep unmarked atoms, they may be in use by the
        !           181:  *                      compiler, or by an API function that calls js_Atomize,
        !           182:  *                      when the GC is called from js_AllocGCThing, due to a
        !           183:  *                      malloc failure or the runtime GC-thing limit.
        !           184:  *   GC_LAST_CONTEXT    Called from js_DestroyContext for last JSContext in a
        !           185:  *                      JSRuntime, when it is imperative that rt->gcPoke gets
        !           186:  *                      cleared early in js_GC, if it is set.
        !           187:  *   GC_ALREADY_LOCKED  rt->gcLock is already held on entry to js_GC, and kept
        !           188:  *                      on return to its caller.
        !           189:  */
        !           190: #define GC_KEEP_ATOMS       0x1
        !           191: #define GC_LAST_CONTEXT     0x2
        !           192: #define GC_ALREADY_LOCKED   0x4
        !           193: 
        !           194: extern void
        !           195: js_ForceGC(JSContext *cx, uintN gcflags);
        !           196: 
        !           197: extern void
        !           198: js_GC(JSContext *cx, uintN gcflags);
        !           199: 
        !           200: #ifdef JS_GCMETER
        !           201: 
        !           202: typedef struct JSGCStats {
        !           203:     uint32  alloc;      /* number of allocation attempts */
        !           204:     uint32  freelen;    /* gcFreeList length */
        !           205:     uint32  recycle;    /* number of things recycled through gcFreeList */
        !           206:     uint32  retry;      /* allocation attempt retries after running the GC */
        !           207:     uint32  fail;       /* allocation failures */
        !           208:     uint32  finalfail;  /* finalizer calls allocator failures */
        !           209:     uint32  lock;       /* valid lock calls */
        !           210:     uint32  unlock;     /* valid unlock calls */
        !           211:     uint32  stuck;      /* stuck reference counts seen by lock calls */
        !           212:     uint32  unstuck;    /* unlock calls that saw a stuck lock count */
        !           213:     uint32  depth;      /* mark recursion depth */
        !           214:     uint32  maxdepth;   /* maximum mark recursion depth */
        !           215:     uint32  maxlevel;   /* maximum GC nesting (indirect recursion) level */
        !           216:     uint32  poke;       /* number of potentially useful GC calls */
        !           217:     uint32  nopoke;     /* useless GC calls where js_PokeGC was not set */
        !           218:     uint32  afree;      /* thing arenas freed so far */
        !           219:     uint32  stackseg;   /* total extraordinary stack segments scanned */
        !           220:     uint32  segslots;   /* total stack segment jsval slots scanned */
        !           221: } JSGCStats;
        !           222: 
        !           223: extern void
        !           224: js_DumpGCStats(JSRuntime *rt, FILE *fp);
        !           225: 
        !           226: #endif /* JS_GCMETER */
        !           227: 
        !           228: JS_END_EXTERN_C
        !           229: 
        !           230: #endif /* jsgc_h___ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.