Closed
Bug 93217
Opened 23 years ago
Closed 23 years ago
[review]nsRenderingContextMac doesn't reference count offscreens
Categories
(Core Graveyard :: GFX, defect, P2)
Tracking
(Not tracked)
RESOLVED
FIXED
mozilla0.9.8
People
(Reporter: jmt, Assigned: pierre)
References
Details
Attachments
(2 files)
815 bytes,
patch
|
Details | Diff | Splinter Review | |
2.21 KB,
patch
|
mikepinkerton
:
review+
|
Details | Diff | Splinter Review |
[kmclusk, I know you're not a Mac person, but in the absence of an explicit owner for gfx/src/mac on the modules pages, I'm hoping you can CC someone who is. dcone? sfraser?] nsRenderingContextMac::CreateDrawingSurface doesn't NS_ADDREF the nsDrawingSurfaceMac it creates; similarly ::DestroyDrawingSurface calls 'delete' explicitly rather than using an NS_IF_RELASE. This is causing instantaneous deletion of the drawing surface when the SVG code I'm helping with passes the surface through getter_AddRefs and friends (since the reference count is zero). Both nsRenderingContextWin and nsRenderingContextGtk use add/release. The fix below simply calls NS_ADDREF in Create, and replaces the delete in ::DestroyDrawingSurface with an NS_IF_RELEASE. I have been running with this change in me tree for several days without any (apparent) issues. Proposed patch: Index: mozilla/gfx/src/mac/nsRenderingContextMac.cpp =================================================================== RCS file: /cvsroot/mozilla/gfx/src/mac/nsRenderingContextMac.cpp,v retrieving revision 1.124 diff -u -2 -r1.124 nsRenderingContextMac.cpp --- mozilla/gfx/src/mac/nsRenderingContextMac.cpp 2001/07/16 02:38:50 1.124 +++ mozilla/gfx/src/mac/nsRenderingContextMac.cpp 2001/08/01 11:08:19 @@ -506,4 +510,6 @@ return NS_ERROR_OUT_OF_MEMORY; + NS_ADDREF(surface); + nsresult rv = surface->Init(depth, macRect.right, macRect.bottom, aSurfFlags); if (NS_SUCCEEDED(rv)) @@ -537,6 +543,8 @@ */ // delete the surface - delete surface; - + //release it... + NS_IF_RELEASE(surface); + return NS_OK; }
Comment 1•23 years ago
|
||
Over to dcone. Note that this blocks SVG work, so we need a fix.
Assignee: kmcclusk → dcone
Status: UNCONFIRMED → NEW
Ever confirmed: true
Comment 2•23 years ago
|
||
The patch seems funny, the +'s dont match up with the Addref, etc. Can you submit the patch -u, and as an attachment. Thanx. Do you want me to check this in.. or just a review.
Reporter | ||
Comment 3•23 years ago
|
||
Reporter | ||
Comment 4•23 years ago
|
||
Attached a non-broken version of the patch, not sure what happened last time. I don't have CVS write access so review and checkin would be appreciated. The only issue for me is whether this change might trigger a leak / crash in some obscure place (eg somone manually add-refing). The fact that Win and Gtk ref-count makes this unlikely, and I've had the patch in my tree for over a week without noticing any suspicous crashes. Anyway test / commit as you see fit. Many thanks!
Blocks: 80142
Comment 5•23 years ago
|
||
r=dcone
Comment 6•23 years ago
|
||
The refcounting rules for ns{I}DrawingSurfaces are very weak, and in most places they are treated like a non-refcounted object. For example, nsRenderingContextImpl::DrawTile() does a GetDrawingSurface((void**)&theSurface), but never calls anything to release or destroy the surface. In addition, nsRenderingContextMac::GetDrawingSurface doesn't addref its return value, and nor does nsDeviceContextMac::GetDrawingSurface(). Add to that the explicit casts between nsDrawingSurfaces and nsDrawingSurfaceMacs (which implement nsIDrawingSurface{Mac}, and you're in for a world of hurt. I'm not going to sr this bug. dcone needs to whack the mac gfx source to make the ownership model of nsDrawingSurface explicit. If that means passing them around as interfaces, and doing proper refcounting, then that's what needs to happen.
Assignee | ||
Comment 7•23 years ago
|
||
It was written in the good ol'days before the general "COM-ification" and many objects that were considered "native" were not refcounted. I agree for the refcounting, that's what this bug is about. I would be more cautious about removing the static casts (we have 4 instances of static_cast< nsDrawingSurfaceMac*>). If you change things in these strategic places, please watch the performance carefully. I recommend we file another bug for that.
Reporter | ||
Comment 8•23 years ago
|
||
I was pretty much afraid of the scenario sfraser suggests. I can keep using my patch locally (it seems to work and I haven't noticed huge leaks). As to fixing the correctness of nsDrawingSurface(Mac) for reference counting generally, well as pierre said it's going to be a bit critical. The obvious (naiive?) validation for me seems to be compare and contrast with Gtk / Win32 implementations, and any code treating these things as nsIDrawingSurfaces will therefore be 'safe' (I think). That still leaves all the cases where people are working with an nsDrawingSurfaceMac directly. One thought I did have for to prevent leaks was to leave the original 'delete' call in DestroyDrawingSurface; this would be a hack but would't leak.
Reporter | ||
Comment 9•23 years ago
|
||
So, I really need some traction here. I've had this patch in my tree for nearly 3 months now, it seems to work for my browser usage. My feeling is that since many other gfx implementations *do* ref-count (win32, gdk, and OS2), the common code must be safe. (The Motif code also fails to ref-count, but I have no idea if that's dead or what..) That leaves the Mac-specific code, especially the casting between nsIDrawingSurfaces and nsDrawingSurfaceMacs which sfraser pointed out. Is this something I can audit, or does it have to be done by dcone? Any hints for useful things to get movement here appreciated.
Comment 10•23 years ago
|
||
Get on IRC and bug people (politely). I'm not being funny, its just the only thing that actually works...
Assignee | ||
Updated•23 years ago
|
Status: NEW → ASSIGNED
Priority: -- → P2
Target Milestone: --- → mozilla0.9.7
Reporter | ||
Comment 12•23 years ago
|
||
This is my usual 'I've had this is my tree since July, and haven't had a single failure or crash that I can attribute to it'. I know sfraser has pointed out potential issues that need to be addressed, but at the same time the very minimal change in the patch does seem to work. If there's useful analysis of suspect code in DrawingSurfaceMac or RenderingContextMac I could do to validate the changes, please let me know.
Comment 13•23 years ago
|
||
dcone is back from sabbatical. He needs to look at this, and fix the nsDrawingSurface mess. Maybe Pierre could chip in too.
Comment 14•23 years ago
|
||
I checked James' patch into SVG_0_9_6_BRANCH. (This is basically a branch where we're trying to get a stable Mozilla 0.9.6 with SVG support on all 3 platforms. It's not destined for the trunk). As for the main svg branch (SVG_20010721_BRANCH), this bug is blocking us from landing on the trunk. We're planning to land for 0.9.7. Is it likely that this bug gets sorted out by then? If not we've got the option of a) landing without mac-support (and break the current trunk svg-support in the process) or b) enclosing James' patch in #ifdef MOZ_SVG's Does anyone have any thoughts on how to proceed?
Comment 15•23 years ago
|
||
I think we should proceed with option b) for now b) enclosing James' patch in #ifdef MOZ_SVG's. This is the least amount of risk. The general offscreen refcnt cleanup will have to wait for other more critical bugs to be addressed first.
Assignee | ||
Comment 16•23 years ago
|
||
sfraser (about comment #6): On none of the other platforms does GetDrawingSurface() addref the surface. I'll attach a patch that makes the ownership on the Mac similar to what we find elsewhere, which is required because nsRenderingContextImpl.cpp is XP code. Changing the ownership on all platforms is out of the scope of this bug (IMO). pink/sfraser: please r/sr
Summary: nsRenderingContextMac doesn't reference count offscreens → [review]nsRenderingContextMac doesn't reference count offscreens
Assignee | ||
Comment 17•23 years ago
|
||
Assignee | ||
Comment 18•23 years ago
|
||
In the proposed patch, a drawing surface is addref'd when it is created or selected, and released when the owning context is deleted or when another surface is selected.
Reporter | ||
Comment 19•23 years ago
|
||
Thanks for the work pierre, I'm glad to have someone more experienced looking at this. Patch looks fine to me, not that that proves much. I will give it some testing anyway.
Comment 20•23 years ago
|
||
I took the option given in comment 15 and checked this to the SVG branch with #ifdef MOZ_SVG The existing code got left as is. We're planning on merging the svg branch to the trunk today; if the more complete patch gets in by then, then the hack can be reversed.
Assignee | ||
Comment 21•23 years ago
|
||
pink/sfraser: please r/sr
Comment 22•23 years ago
|
||
I could have sworn that somewhere in the code, we treat nsDrawingSurfaces as casted CGrafPtrs, If I can find that, then I object to the patch. If I can't, then the patch is OK.
Comment 23•23 years ago
|
||
Comment on attachment 61062 [details] [diff] [review] patch 2.0 i searched through gfx and the only places i found that used the string "CGrafPtr" got it by calling GetGrafPtr() on the surface. r=pink
Attachment #61062 -
Flags: review+
Assignee | ||
Comment 24•23 years ago
|
||
fixed on the trunk
Status: ASSIGNED → RESOLVED
Closed: 23 years ago
Resolution: --- → FIXED
Target Milestone: mozilla0.9.7 → mozilla0.9.8
Updated•16 years ago
|
Product: Core → Core Graveyard
You need to log in
before you can comment on or make changes to this bug.
Description
•