> On Jun 13, 2017, at 1:00 PM, Chris Dumez <cdu...@apple.com> wrote: > > >> On Jun 13, 2017, at 12:51 PM, Filip Pizlo <fpi...@apple.com >> <mailto:fpi...@apple.com>> wrote: >> >>> >>> On Jun 13, 2017, at 12:37 PM, Alex Christensen <achristen...@apple.com >>> <mailto:achristen...@apple.com>> wrote: >>> >>> Ok, maybe we can get rid of std::function, then! I hadn’t used BlockPtr as >>> much as Chris. I’d be opposed to adding a copy constructor to >>> WTF::Function because the non-copyability of WTF::Function is why we made >>> it, and it has prevented many bugs. >> >> I agree that the copy semantics of std::function are strange - each copy >> gets its own view of the state of the closure. This gets super weird when >> you implement an algorithm that accidentally copies the function - the act >> of copying invokes copy constructors on all of the lambda-lifted state, >> which is probably not what you wanted. So I’m not surprised that moving to >> WTF::Function avoided bugs. What I’m proposing also prevents many of the >> same bugs because the lambda-lifted state never gets copied in my world. > > I understand SharedTask avoids many of the same issues. My issue is that it > adds an extra data member for refcounting that is very rarely needed in > practice. Also, because this type is copyable, people can create refcounting > churn by inadvertently copying. > Because most of the time, we do not want to share and WTF::Function is > sufficient as it stands, I do not think it is worth making WTF::Function > refcounted.
Perf is a good argument against this, but then it seems like WTF::Function should by default allow block-style sharing semantics, and then there would be a WTF::UniqueFunction that is more optimal. Also, who is “we” here? If “we” includes JSC, then “we” don’t find WTF::Function sufficient. I try to use WTF::Function whenever I can because I like the name and I like the API, but often I have to switch to SharedTask in order to make the code work. B3’s use of SharedTask for its StackmapGenerator is a great example. We can’t use WTF::Function in that code because the data structures that reference the generator get copied and that’s OK when we use SharedTask. > >> >> Do you think that code that uses ObjC blocks encounters the kind of bugs >> that you saw WTF::Function preventing? Or are the bugs that Function >> prevents more specific to std::function? I guess I’d never heard of a need >> to change block semantics to avoid bugs, so I have a hunch that the bugs you >> guys prevented were specific to the fact that std::function copies instead >> of sharing. > > To be cleared, we viewed this as “copies instead of truly moving”, not > sharing. We never really needed sharing when WTF::Function was initially > called WTF::NonCopyableFunction. > Yes, the bugs we were trying to avoid were related to using std::function and > copying things implicitly, even if you WTFMove() it around. Because we > started using WTF::Function instead of std::function in more places though, > having BlockPtr::fromCallable() to be able to pass a WTF::Function to an ObjC > function expecting a block became handy though. > >> >>> >>> I’ve also seen many cases where I have a WTF::Function that I want to make >>> sure is called once and only once before destruction. I wouldn’t mind >>> adding a WTF::Callback subclass that just asserts that it has been called >>> once. That would’ve prevented some bugs, too, but not every use of >>> WTF::Function has such a requirement. >>> >>>> On Jun 13, 2017, at 12:31 PM, Chris Dumez <cdu...@apple.com >>>> <mailto:cdu...@apple.com>> wrote: >>>> >>>> We already have BlockPtr for passing a Function as a lambda block. >>>> >>>> Chris Dumez >>>> >>>> On Jun 13, 2017, at 12:29 PM, Alex Christensen <achristen...@apple.com >>>> <mailto:achristen...@apple.com>> wrote: >>>> >>>>> std::function, c++ lambda, and objc blocks are all interchangeable. >>>>> WTF::Functions cannot be used as objc blocks because the latter must be >>>>> copyable. Until that changes or we stop using objc, we cannot completely >>>>> eliminate std::function from WebKit. >>>>> _______________________________________________ >>>>> webkit-dev mailing list >>>>> webkit-dev@lists.webkit.org <mailto:webkit-dev@lists.webkit.org> >>>>> https://lists.webkit.org/mailman/listinfo/webkit-dev >>>>> <https://lists.webkit.org/mailman/listinfo/webkit-dev> >>> >>> _______________________________________________ >>> webkit-dev mailing list >>> webkit-dev@lists.webkit.org <mailto:webkit-dev@lists.webkit.org> >>> https://lists.webkit.org/mailman/listinfo/webkit-dev >>> <https://lists.webkit.org/mailman/listinfo/webkit-dev>
_______________________________________________ webkit-dev mailing list webkit-dev@lists.webkit.org https://lists.webkit.org/mailman/listinfo/webkit-dev