[PATCH] unique_ptr with ability to get a raw pointer after release.
Anton Yartsev
anton.yartsev at gmail.com
Thu Sep 25 13:06:43 PDT 2014
On 25.09.2014 22:06, David Blaikie wrote:
>
>
> On Wed, Sep 24, 2014 at 7:15 PM, Антон Ярцев <anton.yartsev at gmail.com
> <mailto:anton.yartsev at gmail.com>> wrote:
>
> The discussion moved to llvmdev, topic "New type of smart pointer
> for LLVM"
>
> ================
> Comment at: include/llvm/ADT/STLExtras.h:572
> @@ +571,3 @@
> +template<class T, class Deleter = SwitchControlledDeleter<T>>
> +class unique_ptr_deferred_release : public std::unique_ptr<T,
> Deleter> {
> +public:
> ----------------
> dblaikie wrote:
> > I'm sorry to go around on this a bit - but it'd be really good
> to just discuss this design for a bit (maybe no llvm-dev for
> increased visibility) as I believe we do have a need for a generic
> "sometimes owns" pointer abstraction and I'm hesitant to build a
> partial or awkward solution here. Some specific concerns (beyond
> the vague one above) are:
> >
> > * inheritance from unique_ptr could be very subtle/surprising -
> especially when hiding inherited functions. Taking a unique_ptr<T,
> ...>& to this unique_ptr_deferred_release and then calling
> release() provides different behavior.
> >
> > * what happens if release() is called twice? (should it be a
> runtime failure? return null? not clear - maybe null return (as
> you've implemented) makes sense)
> >
> > * there should probably be some way to both enter and exit this
> domain with unique_ptr<T, NormalDeleterHere> - so both an implicit
> ctor, and a "take()" perhaps, rather than the release(), comes
> back to the "what to return when non-owning".
> >
> > * "deferred release" doesn't seem to connote the actual use case
> here - that sounds like it might, say, "not release until the end
> of its lifetime, even when released early" which doesn't make much
> sense to me. This is really about conditional ownership - in some
> cases the smart pointer may never own the object. Nothing is
> deferred, it's just not handled here at all.
> >
> > I appreciate the work, and sorry to sort of cast doubt on it -
> and I don't mean to dissuade you from prototyping as you see fit,
> but I don't want to waste your time churning API possibilities if
> you'd rather wait a bit, have a chat about what we're trying to
> solve here, etc and then have a go at implementing (if you prefer
> to have that discussion and iterate on the API design in-code,
> that's fine too - but I don't want to annoy you by making you keep
> reworking your code).
> Thank you for looking at this. I agree with you, inheritance from
> a unique_ptr is not a good idea and 'deferred release' and
> 'release()' ain't a good names. I'll start a new discussion at
> llvm-dev.
>
>
> Thanks!
>
>
> ================
> Comment at: lib/TableGen/TGParser.cpp:235
> @@ -234,3 +234,3 @@
> // Clone the def and add it to the current multiclass
> - Record *NewDef = new Record(**i);
> + auto NewDef = make_unique<Record>(**i);
>
> ----------------
> dblaikie wrote:
> > This change is independent, right? Just general cleanup change
> that could be made today?
> >
> > (DefPrototypes should perhaps be a vector of unique_ptr, so that
> last line in this block can be push_back(std::move(NewDef)); ?)
> Yes, just a general cleanup, unique_ptr is sufficient here.
>
>
> I'd be happy for you to commit that for post-commit review at this
> point, if you like. (or, if you don't have commit access, I can do
> that for you)
Committed at r218462
>
> http://reviews.llvm.org/D5443
>
>
>
--
Anton
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140926/97c844ea/attachment.html>
More information about the llvm-commits
mailing list