WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
57717
Convert use of raw pointers to RefPtr in using Cairo
https://bugs.webkit.org/show_bug.cgi?id=57717
Summary
Convert use of raw pointers to RefPtr in using Cairo
Joone Hur
Reported
2011-04-02 21:51:36 PDT
We need to use RefPtr instead of raw pointers when using cairo_t, cairo_surface_t in WebCore/platform/graphics/cairo.
Attachments
Proposed Patch
(19.87 KB, patch)
2011-04-03 07:03 PDT
,
Joone Hur
no flags
Details
Formatted Diff
Diff
Proposed Patch2
(20.18 KB, patch)
2011-04-03 09:20 PDT
,
Joone Hur
no flags
Details
Formatted Diff
Diff
Proposed Patch3
(17.98 KB, patch)
2011-04-03 11:00 PDT
,
Joone Hur
eric
: review-
Details
Formatted Diff
Diff
Proposed Patch4
(17.99 KB, patch)
2011-04-05 06:00 PDT
,
Joone Hur
mrobinson
: review-
Details
Formatted Diff
Diff
Proposed Patch5
(22.17 KB, patch)
2011-04-06 20:16 PDT
,
Joone Hur
no flags
Details
Formatted Diff
Diff
Proposed Patch6
(5.72 KB, patch)
2011-04-12 03:34 PDT
,
Joone Hur
no flags
Details
Formatted Diff
Diff
Proposed Patch7
(7.09 KB, patch)
2011-04-13 11:12 PDT
,
Joone Hur
mrobinson
: review-
Details
Formatted Diff
Diff
Proposed Patch8
(3.83 KB, patch)
2011-04-14 00:38 PDT
,
Joone Hur
no flags
Details
Formatted Diff
Diff
Show Obsolete
(7)
View All
Add attachment
proposed patch, testcase, etc.
Joone Hur
Comment 1
2011-04-03 07:03:21 PDT
Created
attachment 88009
[details]
Proposed Patch
WebKit Review Bot
Comment 2
2011-04-03 07:08:25 PDT
Attachment 88009
[details]
did not build on chromium: Build output:
http://queues.webkit.org/results/8247736
Early Warning System Bot
Comment 3
2011-04-03 07:12:48 PDT
Attachment 88009
[details]
did not build on qt: Build output:
http://queues.webkit.org/results/8328020
WebKit Review Bot
Comment 4
2011-04-03 07:59:03 PDT
Attachment 88009
[details]
did not build on chromium: Build output:
http://queues.webkit.org/results/8318751
Joone Hur
Comment 5
2011-04-03 09:20:41 PDT
Created
attachment 88011
[details]
Proposed Patch2
WebKit Review Bot
Comment 6
2011-04-03 09:23:42 PDT
Attachment 88011
[details]
did not build on chromium: Build output:
http://queues.webkit.org/results/8319696
WebKit Review Bot
Comment 7
2011-04-03 10:16:11 PDT
Attachment 88011
[details]
did not build on chromium: Build output:
http://queues.webkit.org/results/8307749
Joone Hur
Comment 8
2011-04-03 11:00:27 PDT
Created
attachment 88012
[details]
Proposed Patch3
Eric Seidel (no email)
Comment 9
2011-04-03 22:59:10 PDT
Comment on
attachment 88012
[details]
Proposed Patch3 View in context:
https://bugs.webkit.org/attachment.cgi?id=88012&action=review
This patch makes my heart sing! Unfortunately I think it also will make WebCore crash (in the one case I pointed out.
> Source/WebCore/platform/graphics/cairo/ContextShadowCairo.cpp:82 > + scratchBuffer = adoptRef(cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height)); > + return scratchBuffer.get();
Um. This isn't going to work, or? I think you want to return a PassRefPtr here.
Martin Robinson
Comment 10
2011-04-04 07:04:59 PDT
Comment on
attachment 88012
[details]
Proposed Patch3 View in context:
https://bugs.webkit.org/attachment.cgi?id=88012&action=review
>> Source/WebCore/platform/graphics/cairo/ContextShadowCairo.cpp:82 >> + return scratchBuffer.get(); > > Um. This isn't going to work, or? I think you want to return a PassRefPtr here.
I think it should work, since scratchBuffer is a static global. This patch should probably rename "scratchBuffer" to something like "gScratchBuffer" to make it clear that it's static though.
Joone Hur
Comment 11
2011-04-04 08:55:03 PDT
(In reply to
comment #10
)
> (From update of
attachment 88012
[details]
) > View in context:
https://bugs.webkit.org/attachment.cgi?id=88012&action=review
> > >> Source/WebCore/platform/graphics/cairo/ContextShadowCairo.cpp:82 > >> + return scratchBuffer.get(); > > > > Um. This isn't going to work, or? I think you want to return a PassRefPtr here. > > I think it should work, since scratchBuffer is a static global. This patch should probably rename "scratchBuffer" to something like "gScratchBuffer" to make it clear that it's static though.
This code works well without any crash.
http://www.w3schools.com/css3/tryit.asp?filename=trycss3_box-shadow
Joone Hur
Comment 12
2011-04-05 06:00:30 PDT
Created
attachment 88212
[details]
Proposed Patch4 I updated the patch with the change suggested by Martin. Thanks, Eric and Martin for the review.
Martin Robinson
Comment 13
2011-04-05 08:34:23 PDT
Comment on
attachment 88212
[details]
Proposed Patch4 View in context:
https://bugs.webkit.org/attachment.cgi?id=88212&action=review
r- because of some minor style issues and a possible leak you might be able to fix!
> Source/WebCore/platform/graphics/ContextShadow.h:38 > +#if PLATFORM(CAIRO) > +#include "RefPtrCairo.h" > +#endif > #include <wtf/RefCounted.h>
This should be in separate block.
> Source/WebCore/platform/graphics/ContextShadow.h:133 > +#if PLATFORM(CAIRO) > + RefPtr<cairo_surface_t> m_layerImage; // Buffer to where the temporary shadow will be drawn to. > + RefPtr<cairo_t> m_layerContext; // Context used to paint the shadow to the layer image. > +#else
Why not use change the typedefs above instead of adding #ifdefs to the code?
> Source/WebCore/platform/graphics/cairo/CairoPath.h:35 > static cairo_surface_t* pathSurface = cairo_image_surface_create(CAIRO_FORMAT_A8, 1, 1); > - m_cr = cairo_create(pathSurface); > + m_cr = adoptRef(cairo_create(pathSurface));
Looking at this now, isn't the surface leaked? It scould be a RefPtr here too.
Joone Hur
Comment 14
2011-04-06 20:16:04 PDT
Created
attachment 88561
[details]
Proposed Patch5 I applied Martin's suggestions to the patch. Thanks!
Martin Robinson
Comment 15
2011-04-07 07:56:49 PDT
Comment on
attachment 88561
[details]
Proposed Patch5 View in context:
https://bugs.webkit.org/attachment.cgi?id=88561&action=review
> Source/WebCore/platform/graphics/ContextShadow.h:38 > +#if PLATFORM(CAIRO) > +#include "RefPtrCairo.h" > +#endif > +
Please move this to a separate block with a newline between the first block of includes and this one.
> Source/WebCore/platform/graphics/ContextShadow.h:57 > +typedef RefPtr<cairo_surface_t> PlatformImage;
We don't need to take a reference to the m_layerImage, so maybe it makes sense to just leave this as a cairo_surface_t. What do you think?
> Source/WebCore/platform/graphics/cairo/CairoPath.h:34 > + static RefPtr<cairo_surface_t> pathSurface = adoptRef(cairo_image_surface_create(CAIRO_FORMAT_A8, 1, 1));
Ack! I didn't realize this was static. Please revert this line. Sorry!
> Source/WebCore/platform/graphics/cairo/FontCairo.cpp:95 > + RefPtr<cairo_t> shadowContext = shadow->beginShadowLayer(graphicsContext, fontExtentsRect); > + if (shadowContext.get()) { > + prepareContextForGlyphDrawing(shadowContext.get(), font, point); > + drawGlyphsToContext(shadowContext.get(), font, glyphs, numGlyphs); > shadow->endShadowLayer(graphicsContext);
I don't think you should use RefPtr here since you don't want to take a reference.
> Source/WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp:171 > - cairo_t* shadowContext = shadow->beginShadowLayer(context, solidFigureExtents); > - if (!shadowContext) > + RefPtr<cairo_t> shadowContext = shadow->beginShadowLayer(context, solidFigureExtents); > + if (!shadowContext.get())
Ditto. I don't think it adds anything here.
> Source/WebCore/platform/graphics/cairo/ImageCairo.cpp:143 > if (shadow->m_type != ContextShadow::NoShadow) { > - cairo_t* shadowContext = shadow->beginShadowLayer(context, dstRect); > + RefPtr<cairo_t> shadowContext = shadow->beginShadowLayer(context, dstRect); > if (shadowContext) {
Ditto.
> Source/WebCore/platform/graphics/gtk/FontGtk.cpp:248 > - cairo_t* shadowContext = shadow->beginShadowLayer(graphicsContext, extents); > + RefPtr<cairo_t> shadowContext = shadow->beginShadowLayer(graphicsContext, extents);
Ditto.
Joone Hur
Comment 16
2011-04-08 10:25:59 PDT
(In reply to
comment #15
)
> (From update of
attachment 88561
[details]
) > View in context:
https://bugs.webkit.org/attachment.cgi?id=88561&action=review
> > > Source/WebCore/platform/graphics/ContextShadow.h:38 > > +#if PLATFORM(CAIRO) > > +#include "RefPtrCairo.h" > > +#endif > > + > > Please move this to a separate block with a newline between the first block of includes and this one. >
I will fix it.
> > Source/WebCore/platform/graphics/ContextShadow.h:57 > > +typedef RefPtr<cairo_surface_t> PlatformImage; > > We don't need to take a reference to the m_layerImage, so maybe it makes sense to just leave this as a cairo_surface_t. What do you think? >
I agree. m_layerImage just takes a static pointer of cairo_surface_t, so we don't need to mange the reference count.
> > Source/WebCore/platform/graphics/cairo/CairoPath.h:34 > > + static RefPtr<cairo_surface_t> pathSurface = adoptRef(cairo_image_surface_create(CAIRO_FORMAT_A8, 1, 1)); > > Ack! I didn't realize this was static. Please revert this line. Sorry! >
That's ok.
> > Source/WebCore/platform/graphics/cairo/FontCairo.cpp:95 > > + RefPtr<cairo_t> shadowContext = shadow->beginShadowLayer(graphicsContext, fontExtentsRect); > > + if (shadowContext.get()) { > > + prepareContextForGlyphDrawing(shadowContext.get(), font, point); > > + drawGlyphsToContext(shadowContext.get(), font, glyphs, numGlyphs); > > shadow->endShadowLayer(graphicsContext); > > I don't think you should use RefPtr here since you don't want to take a reference. >
However, beginShadowLayer returns RefPtr<cairo_t>, so I need to use RefPtr here.
Martin Robinson
Comment 17
2011-04-08 10:30:17 PDT
Comment on
attachment 88561
[details]
Proposed Patch5 View in context:
https://bugs.webkit.org/attachment.cgi?id=88561&action=review
>>> Source/WebCore/platform/graphics/cairo/FontCairo.cpp:95 >>> shadow->endShadowLayer(graphicsContext); >> >> I don't think you should use RefPtr here since you don't want to take a reference. > > However, beginShadowLayer returns RefPtr<cairo_t>, so I need to use RefPtr here.
Typically things only return a PassRefPtr if they are handing off ownership. It seems that beginShadowLayer shouldn't make this suggestion.
Joone Hur
Comment 18
2011-04-08 10:55:37 PDT
(In reply to
comment #17
)
> (From update of
attachment 88561
[details]
) > View in context:
https://bugs.webkit.org/attachment.cgi?id=88561&action=review
> > >>> Source/WebCore/platform/graphics/cairo/FontCairo.cpp:95 > >>> shadow->endShadowLayer(graphicsContext); > >> > >> I don't think you should use RefPtr here since you don't want to take a reference. > > > > However, beginShadowLayer returns RefPtr<cairo_t>, so I need to use RefPtr here. > > Typically things only return a PassRefPtr if they are handing off ownership. It seems that beginShadowLayer shouldn't make this suggestion.
Yes, we can't use a PassRefPtr as return value here, so it seems to make sense to just leave m_layerContext as a cairo_t to return a raw pointer.
Brent Fulgham
Comment 19
2011-04-11 13:07:01 PDT
Comment on
attachment 88561
[details]
Proposed Patch5 View in context:
https://bugs.webkit.org/attachment.cgi?id=88561&action=review
>>> Source/WebCore/platform/graphics/cairo/CairoPath.h:34 >>> + static RefPtr<cairo_surface_t> pathSurface = adoptRef(cairo_image_surface_create(CAIRO_FORMAT_A8, 1, 1)); >> >> Ack! I didn't realize this was static. Please revert this line. Sorry! > > That's ok.
Is this static really threadsafe? Under MSVCRT (which also uses this code) there is no guarantee that this will only execute once. Could it be changed to a static initializer so that it is known to complete prior to multi-threaded execution?
Joone Hur
Comment 20
2011-04-12 03:34:02 PDT
Created
attachment 89184
[details]
Proposed Patch6 Creating the pathSurface could be threadsafe.
Hajime Morrita
Comment 21
2011-04-12 13:35:17 PDT
Comment on
attachment 89184
[details]
Proposed Patch6 View in context:
https://bugs.webkit.org/attachment.cgi?id=89184&action=review
> Source/WebCore/platform/graphics/cairo/CairoPath.h:31 > +{
This isn't thread-safe as before. I guess what Brent said is that you can put the variable to the file static scope, and to make linkers/loaders to call its constructor. In general it's good to avoid static initializers. But WebKit uses it many places so you don't worry about to use it ;-)
Joone Hur
Comment 22
2011-04-13 11:12:25 PDT
Created
attachment 89407
[details]
Proposed Patch7 Thanks for your suggestions.
Martin Robinson
Comment 23
2011-04-13 11:58:03 PDT
Comment on
attachment 89407
[details]
Proposed Patch7 View in context:
https://bugs.webkit.org/attachment.cgi?id=89407&action=review
I apologize that this change has balooned from its original intent. I understand if you wish to separate out the parts of the change into separate bugs.
> Source/WebCore/platform/graphics/cairo/CairoPath.cpp:18 > +/* > + Copyright (C) 2011 Collabora Ltd. > + > + This library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Library General Public > + License as published by the Free Software Foundation; either > + version 2 of the License, or (at your option) any later version. > + > + This library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Library General Public License for more details. > + > + You should have received a copy of the GNU Library General Public License > + aint with this library; see the file COPYING.LIB. If not, write to > + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, > + Boston, MA 02110-1301, USA. > +*/
I think it's good that you are moving this stuff into an actual implementation file since it's becoming heftier. Please, please take this opportunity to rename this to PlatformPathCairo though. Having CairoPath.{cpp,h} and PathCairo.cpp is incredibly confusing! Please format this license blocks with asterisks down the left side to match the other files in this directory.
> Source/WebCore/platform/graphics/cairo/CairoPath.cpp:25 > +cairo_surface_t* CairoPath::m_pathSurface = cairo_image_surface_create(CAIRO_FORMAT_A8, 1, 1);
Now that this is in a CPP file you can dispense with the static class member altogether and just do: static cairo_surface_t* getPathSurface() { static pathSurface = cairo_image_surface_create(CAIRO_FORMAT_A8, 1, 1); return pathSurface; }
> Source/WebCore/platform/graphics/cairo/CairoPath.h:35 > CairoPath() > { > - static cairo_surface_t* pathSurface = cairo_image_surface_create(CAIRO_FORMAT_A8, 1, 1); > - m_cr = cairo_create(pathSurface); > + m_cr = adoptRef(cairo_create(m_pathSurface)); > }
Please move the implementation of the constructor into the CPP file so you can remove the cairo.h include above. The assignment of m_cr should be an initializer. CairoPath() : m_cr(adoptRef(cairo_create(m_pathSurface)) { }
> Source/WebCore/platform/graphics/cairo/CairoPath.h:40 > ~CairoPath() > { > - cairo_destroy(m_cr); > } >
This can be one line now and perhaps even omitted.
> Source/WebCore/platform/graphics/cairo/CairoPath.h:45 > + static cairo_surface_t* m_pathSurface;
You can remove this. See above.
Joone Hur
Comment 24
2011-04-13 23:42:14 PDT
(In reply to
comment #23
)
> (From update of
attachment 89407
[details]
) > View in context:
https://bugs.webkit.org/attachment.cgi?id=89407&action=review
> > I apologize that this change has balooned from its original intent. I understand if you wish to separate out the parts of the change into separate bugs.
No problem, it would be good to file a new bug to deal with the thread-safety issue.
Joone Hur
Comment 25
2011-04-13 23:43:04 PDT
(In reply to
comment #24
)
> (In reply to
comment #23
) > > (From update of
attachment 89407
[details]
[details]) > > View in context:
https://bugs.webkit.org/attachment.cgi?id=89407&action=review
> > > > I apologize that this change has balooned from its original intent. I understand if you wish to separate out the parts of the change into separate bugs. > > No problem, it would be good to file a new bug to deal with the thread-safety issue.
https://bugs.webkit.org/show_bug.cgi?id=58514
Joone Hur
Comment 26
2011-04-14 00:38:57 PDT
Created
attachment 89545
[details]
Proposed Patch8 This patch is updated to only deal with replacing raw pointers with RefPtr.
WebKit Commit Bot
Comment 27
2011-04-14 19:12:43 PDT
Comment on
attachment 89545
[details]
Proposed Patch8 Clearing flags on attachment: 89545 Committed
r83932
: <
http://trac.webkit.org/changeset/83932
>
WebKit Commit Bot
Comment 28
2011-04-14 19:12:50 PDT
All reviewed patches have been landed. Closing bug.
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug