Closed Bug 25911 Opened 25 years ago Closed 25 years ago

Leaking JSContexts

Categories

(Core :: XPConnect, defect, P3)

defect

Tracking

()

RESOLVED FIXED

People

(Reporter: beard, Assigned: jband_mozilla)

References

()

Details

(Keywords: memory-leak)

Attachments

(2 files)

You are creating XPCContext objects in XPCJSRuntime::SyncXPCContextList(), and 
adding them to a JSContext2XPCContextMap (XPCJSRuntime::mContextMap), but 
evidently not cleaning up the contents of the map in 
XPCJSRuntime::~XPCJSRuntime().
Attached file Annotated leak report (deleted) —
No.

The management of XPCContext objects is working correctly. SyncXPCContextList 
uses KillDeadContextsCB which deletes unneeded XPCContext objects an removed 
them from the hashtable using:

    // this XPCContext represents a dead JSContext - delete it
    delete xpcc;
    return HT_ENUMERATE_REMOVE;

This can be verified by running a xpconnect in an embedding that does not leak 
the underlying JSContexts; e.g. xpcshell running xpctest_echo.js

No, the real problem is that mozilla.exe leaks JSContexts and/or does not notify 
xpconnect to resync in all places where JSContexts are deleted.

I have leak detection code in XPCJSRuntime::~XPCJSRuntime() I just added a block 
to iterate all JSContexts and report the count:

#ifdef DEBUG_jband
    {
    // count the total JSContexts in use
    JSContext* iter = nsnull;
    int count = 0;
    while(JS_ContextIterator(mJSRuntime, &iter))
        count ++;
    printf("deleting XPCJSRuntime with %d total live JSContexts\n", count);        
    }
#endif

Running the checked in bloaty tests I see:

deleting XPCJSRuntime with 3 total live JSContexts
deleting XPCJSRuntime with 3 live JSContexts known by xpconnect
deleting XPCJSRuntime with 2 live xpcwrappednativeclasses
...and...
the report lines show that one nsJSContext is leaked. 

There must be other JSContexts created in the system. 

I can explore further.

[changing bug title from...
  [MLK] Leaking XPCContexts
...to...
  [MLK] Leaking JSContexts
Status: NEW → ASSIGNED
Summary: [MLK] Leaking XPCContexts → [MLK] Leaking JSContexts
I only report what I see. My attachment shows that there's an unaccounted for 
XPCContext, that ISN'T referred to by any other leaked object. This is a GC-based 
leak detector, so if the object were being referenced by any other leaked object, 
I would see it.
Sure. The xpconnect shutdown code is whacking the map that references the 
XPCContext objects and yes I agree that when the map gets whacked there is no 
reason to not delete any remaining XPCContexts. I can add that code. This is a 
shutdown only issue. XPCContext objects correctly come and go during the life of 
the app.

Still, the underlying problem is really that we are leaking JSContexts. 
Keywords: mlk
Summary: [MLK] Leaking JSContexts → Leaking JSContexts
These JSContexts are leaked because nsJSContexts are leaked by the cycle 
described in http://bugzilla.mozilla.org/show_bug.cgi?id=28570
Depends on: 28570
Is this fixed then?
I believe this is fixed.
Status: ASSIGNED → RESOLVED
Closed: 25 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: