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