Closed
Bug 1037691
Opened 10 years ago
Closed 10 years ago
Remove public destructors of classes that inherit refcount
Categories
(Core :: General, defect)
Core
General
Tracking
()
RESOLVED
FIXED
mozilla33
People
(Reporter: BenWa, Assigned: BenWa)
References
Details
Attachments
(2 files, 11 obsolete files)
(deleted),
patch
|
ehsan.akhgari
:
review-
|
Details | Diff | Splinter Review |
(deleted),
patch
|
BenWa
:
review+
|
Details | Diff | Splinter Review |
+++ This bug was initially created as a clone of Bug #1027251 +++
Just following the path of bug 1027251 to also cover the case where the class inherit the refcount indirectly.
Assignee | ||
Comment 1•10 years ago
|
||
Assignee | ||
Comment 2•10 years ago
|
||
Attachment #8454753 -
Flags: review?(jmuizelaar)
Assignee | ||
Comment 3•10 years ago
|
||
Attachment #8454754 -
Flags: review?(jmuizelaar)
Assignee | ||
Comment 4•10 years ago
|
||
Attachment #8454756 -
Flags: review?(bent.mozilla)
Assignee | ||
Comment 5•10 years ago
|
||
Attachment #8454757 -
Flags: review?(bent.mozilla)
Assignee | ||
Comment 6•10 years ago
|
||
Attachment #8454758 -
Flags: review?(bent.mozilla)
Assignee | ||
Comment 7•10 years ago
|
||
Attachment #8454759 -
Flags: review?(honzab.moz)
Assignee | ||
Comment 8•10 years ago
|
||
Attachment #8454761 -
Flags: review?(hsivonen)
Assignee | ||
Comment 9•10 years ago
|
||
Attachment #8454762 -
Flags: review?(benjamin)
Assignee | ||
Comment 10•10 years ago
|
||
This is only partially completed. I'm going to try and get this landed to avoid excessive rot.
Assignee | ||
Comment 11•10 years ago
|
||
Comment 12•10 years ago
|
||
Comment on attachment 8454752 [details] [diff] [review]
part 1: Add assert
Review of attachment 8454752 [details] [diff] [review]:
-----------------------------------------------------------------
::: xpcom/glue/nsISupportsImpl.h
@@ +85,5 @@
> }
> # define MOZ_IS_DESTRUCTIBLE(X) (mozilla::IsDestructibleFallback<X>::value)
> #endif
>
> +#ifdef MOZ_CAN_USE_IS_DESTRUCTIBLE_FALLBACK
Why hide this code behind this macro?
@@ +108,5 @@
> + template<typename T>
> + struct HasAddRef
> + : HasAddRefImpl::Selector<T>::type
> + {
> + };
I wish we could implement std::is_member_function_pointer in mfbt/TypeTraits.h for this. That would require variadic template support though, and it may work in different ways on different compilers, so I don't want to make you do that here, but at least please file a follow-up.
@@ +126,5 @@
> MOZ_IS_DESTRUCTIBLE(X), \
> "Class " #X " has no public destructor. That's good! So please " \
> "remove the HasDangerousPublicDestructor specialization for it.");
> #else
> +#define MOZ_ASSERT_NO_PUBLIC_DTOR_IF_REFCOUNTED(X)
Why is this line needed?
@@ +131,4 @@
> #define MOZ_ASSERT_TYPE_OK_FOR_REFCOUNTING(X)
> #endif
>
> +#if defined(MOZ_HAS_ADDREF) && defined(MOZ_IS_DESTRUCTIBLE)
I guess I don't understand the macro logic here at all. Which compilers would barf on HasAddRef above? I think we need to handle those specifically, although looking over the implementation of HasAddRef I can't immediately spot a feature being used which wouldn't work on all of our compilers...
Attachment #8454752 -
Flags: review?(ehsan) → review-
Comment 13•10 years ago
|
||
Comment on attachment 8454759 [details] [diff] [review]
part 7: netwerk
Review of attachment 8454759 [details] [diff] [review]:
-----------------------------------------------------------------
r+ with few nits, if this builds, go land it.
::: netwerk/cache2/CacheEntry.h
@@ +363,5 @@
> class CacheOutputCloseListener : public nsRunnable
> {
> public:
> void OnOutputClosed();
> +protected:
make it private please, this class should probably be marked as MOZ_FINAL. (put to the private: section just bellow)
::: netwerk/cache2/CacheFileIOManager.cpp
@@ +1100,5 @@
> {
> MOZ_COUNT_DTOR(UpdateIndexEntryEvent);
> }
>
> +public:
not sure Run() methods in this file need to be public.
Attachment #8454759 -
Flags: review?(honzab.moz) → review+
Comment 14•10 years ago
|
||
Updated•10 years ago
|
Attachment #8455361 -
Flags: review?(bgirard)
Comment 15•10 years ago
|
||
Comment on attachment 8454762 [details] [diff] [review]
part 9: fix rdf
I believe that this is an indication of a real bug, so I attached an alternate patch.
Attachment #8454762 -
Flags: review?(benjamin) → review-
Assignee | ||
Updated•10 years ago
|
Attachment #8455361 -
Flags: review?(bgirard) → review+
Assignee | ||
Comment 16•10 years ago
|
||
(In reply to Benjamin Smedberg [:bsmedberg] from comment #15)
> Comment on attachment 8454762 [details] [diff] [review]
> part 9: fix rdf
>
> I believe that this is an indication of a real bug, so I attached an
> alternate patch.
I was planning on dealing with it in follow up. Since this is a large refactor I wanted to have a patch queue that had no side effects. But I'm ok with this tagging along.
Comment 17•10 years ago
|
||
blanket-r=me on all patches which make destructors private for this purpose unless they contain anything interesting that you want the owners/peers to review.
Updated•10 years ago
|
Attachment #8454754 -
Flags: review?(jmuizelaar) → review+
Comment 18•10 years ago
|
||
Comment on attachment 8454754 [details] [diff] [review]
Part 3: Fix gfx bug in widget
One nit:
>+++ b/widget/xpwidgets/nsBaseWidget.cpp
>@@ -900,17 +900,17 @@ void nsBaseWidget::CreateCompositor(int
> return;
> }
>
> // Initialize LayerScope on the main thread.
> LayerScope::Init();
>
> mCompositorParent = NewCompositorParent(aWidth, aHeight);
> MessageChannel *parentChannel = mCompositorParent->GetIPCChannel();
>- ClientLayerManager* lm = new ClientLayerManager(this);
>+ nsRefPtr<ClientLayerManager> lm = new ClientLayerManager(this);
A bit lower down, we have, for the normal case:
mLayerManager = lm;
return;
http://mxr.mozilla.org/mozilla-central/source/widget/xpwidgets/nsBaseWidget.cpp#940
...where mLayerManager is a nsRefPtr. Now that 'lm' is also a nsRefPtr, we'll be doing an unnecessary AddRef/Release dance here. (We increment count to 2, for the assignment, and then we decrement it back to 1 when lm goes out of scope)
You can do away with the dance & make this a bit faster by using:
mLayerManager = lm.forget();
(Since 'forget()' returns already_AddRefed, which nsRefPtr's reassignment operator knows how to handle.)
Assignee | ||
Comment 19•10 years ago
|
||
Attachment #8455728 -
Flags: review?(ehsan)
Assignee | ||
Comment 20•10 years ago
|
||
Comment on attachment 8454757 [details] [diff] [review]
part 5: Fix DOM
Review of attachment 8454757 [details] [diff] [review]:
-----------------------------------------------------------------
Trivial, removing review request.
Attachment #8454757 -
Flags: review?(bent.mozilla)
Assignee | ||
Comment 21•10 years ago
|
||
Comment on attachment 8454758 [details] [diff] [review]
part 6: Fix ipc
Review of attachment 8454758 [details] [diff] [review]:
-----------------------------------------------------------------
Trivial, removing review request.
Attachment #8454758 -
Flags: review?(bent.mozilla)
Comment 22•10 years ago
|
||
Comment on attachment 8455728 [details] [diff] [review]
Part 10: Rest
>+++ b/layout/base/MaskLayerImageCache.cpp
>+// This case is particially 'particularly' because it uses AddRef/Release to track the use
>+// not to release the object.
>+template<>
>+struct mozilla::HasDangerousPublicDestructor<MaskLayerImageCache::MaskLayerImageKey>
Nit: typo in the comment there -- I think maybe you meant to say
particularly 'particular'
or something like that?
Assignee | ||
Comment 23•10 years ago
|
||
(In reply to Daniel Holbert [:dholbert] from comment #18)
Done but I don't really think this type of trivial optimization matters.
(In reply to Daniel Holbert [:dholbert] from comment #22)
> Comment on attachment 8455728 [details] [diff] [review]
> Part 10: Rest
>
> >+++ b/layout/base/MaskLayerImageCache.cpp
> >+// This case is particially 'particularly' because it uses AddRef/Release to track the use
> >+// not to release the object.
> >+template<>
> >+struct mozilla::HasDangerousPublicDestructor<MaskLayerImageCache::MaskLayerImageKey>
>
> Nit: typo in the comment there -- I think maybe you meant to say
> particularly 'particular'
> or something like that?
Thanks1 Fixed.
Assignee | ||
Comment 24•10 years ago
|
||
Comment on attachment 8454761 [details] [diff] [review]
part 8: Fix parser
Review of attachment 8454761 [details] [diff] [review]:
-----------------------------------------------------------------
canceling trivial review.
Attachment #8454761 -
Flags: review?(hsivonen)
Assignee | ||
Updated•10 years ago
|
Attachment #8454753 -
Flags: review?(jmuizelaar)
Assignee | ||
Comment 25•10 years ago
|
||
I was going to follow bjacob' footsteps but I decided that asking for these reviews from different peers is a waste of everyone time. If someone has a valid objection to anything landed here please let me know.
I will however wait for :bent to look into HasDangerousPublicDestructor<MiscContainer>.
Attachment #8454753 -
Attachment is obsolete: true
Attachment #8454754 -
Attachment is obsolete: true
Attachment #8454757 -
Attachment is obsolete: true
Attachment #8454758 -
Attachment is obsolete: true
Attachment #8454759 -
Attachment is obsolete: true
Attachment #8454761 -
Attachment is obsolete: true
Attachment #8454762 -
Attachment is obsolete: true
Attachment #8455361 -
Attachment is obsolete: true
Comment 26•10 years ago
|
||
Comment on attachment 8455728 [details] [diff] [review]
Part 10: Rest
Review of attachment 8455728 [details] [diff] [review]:
-----------------------------------------------------------------
::: layout/base/MaskLayerImageCache.cpp
@@ +57,5 @@
> entry->mContainer = aContainer;
> }
>
> +// This case is particially 'particularly' because it uses AddRef/Release to track the use
> +// not to release the object.
This comment makes no sense! ;)
Attachment #8455728 -
Flags: review?(ehsan) → review+
Assignee | ||
Comment 27•10 years ago
|
||
(In reply to :Ehsan Akhgari (lagging on bugmail, needinfo? me!) from comment #26)
> Comment on attachment 8455728 [details] [diff] [review]
> Part 10: Rest
>
> Review of attachment 8455728 [details] [diff] [review]:
> -----------------------------------------------------------------
>
> ::: layout/base/MaskLayerImageCache.cpp
> @@ +57,5 @@
> > entry->mContainer = aContainer;
> > }
> >
> > +// This case is particially 'particularly' because it uses AddRef/Release to track the use
> > +// not to release the object.
>
> This comment makes no sense! ;)
It was a copy paste error:
// This case is particularly 'clever' because it uses AddRef/Release to track the use
// not to release the object.
Assignee | ||
Comment 28•10 years ago
|
||
Updated•10 years ago
|
Attachment #8454756 -
Flags: review?(bent.mozilla) → review+
Assignee | ||
Comment 29•10 years ago
|
||
Attachment #8454756 -
Attachment is obsolete: true
Attachment #8455728 -
Attachment is obsolete: true
Attachment #8455796 -
Attachment is obsolete: true
Attachment #8456340 -
Flags: review+
Comment 30•10 years ago
|
||
Status: ASSIGNED → RESOLVED
Closed: 10 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla33
You need to log in
before you can comment on or make changes to this bug.
Description
•