> On Jun 13, 2017, at 9:55 AM, Filip Pizlo <[email protected]> wrote:
> 
> Would SharedTask’s sharing be semantically incorrect for users of 
> WTF::Function?  In other words, do you rely on the compiler error that says 
> that there is no copy constructor?


WTF::Function is used in cross-thread dispatching, where arguments captured by 
the lambda are “thread safe copied”, “isolated copied”, etc.

Part of the safety is the lack of a copy constructor, as accidentally making a 
copy on the originating thread can invalidate the setup for thread safety.

So, yes, they must maintain move-only semantics.

> I’m imagining that if WTF::Function was backed by SharedTask that it would 
> not result in any behavior change for existing WTF::Function users.

I see the reverse. Is there any reason SharedTask can’t be backed by a 
WTF::Function?

There’s no harm in adding Ref counting semantics on top the move-only 
WTF::Function if SharedTask is your goal.

Thanks,
 Brady

>  At worst, it would mean that WTF::Function’s backing store has an extra word 
> for the ref count - but if you only move and never copy then this word starts 
> out at 1 and stays there until death, so it’s very cheap.
> 
> -Filip
> 
> 
>> On Jun 13, 2017, at 9:43 AM, Chris Dumez <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> In most cases in WebCore at least, we don’t actually want to share ownership 
>> of the lambda so we don’t need RefCounting / SharedTask. Because of this, I 
>> don’t think we should merge SharedTask into Function. I think that as it 
>> stands, WTF::Function is a suitable replacement for most uses in WebCore 
>> since we actually very rarely need copying (either it just builds or the 
>> code can be refactored very slightly to avoid the copying).
>> 
>> --
>>  Chris Dumez
>> 
>> 
>> 
>> 
>>> On Jun 13, 2017, at 9:34 AM, Filip Pizlo <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> 
>>> We should have a better story here.  Right now the story is too 
>>> complicated.  We have:
>>> 
>>> - ScopedLambda or ScopedLambdaRef if you have a stack-allocated function 
>>> that outlives its user
>>> - SharedTask if you have a heap-allocated function that you want to share 
>>> and ref-count
>>> - WTF::Function if you have a heap-allocated function that you want to 
>>> transfer ownership (move yes, copy no)
>>> - std::function if you have a heap-alloated function that you want to pass 
>>> by copy
>>> 
>>> Only std::function and WTF::Function do the magic that lets you say:
>>> 
>>> std::function f = <lambda>
>>> 
>>> Also, std::function has the benefit that it does copying.  None of the 
>>> others do that.
>>> 
>>> ScopedLambda serves a specific purpose: it avoids allocation.  Probably we 
>>> want to keep that one even if we merge the others.
>>> 
>>> IMO SharedTask has the nicest semantics.  I don’t ever want the activation 
>>> of the function to be copied.  In my experience I always want sharing if 
>>> more than one reference to the function exists.  I think that what we 
>>> really want in most places is a WTF::Function that has sharing semantics 
>>> like SharedTask.  That would let us get rid of std::function and SharedTask.
>>> 
>>> In the current status quo, it’s not always correct to convert std::function 
>>> to the others because:
>>> 
>>> - Unlike ScopedLambda and SharedTask, std::function has the magic 
>>> constructor that allows you to just assign a lambda to it.
>>> - Unlike ScopedLambda, std::function is safe if the use is not scoped.
>>> - Unlike WTF::Function, std::function can be copied.
>>> 
>>> -Filip
>>> 
>>> 
>>>> On Jun 13, 2017, at 9:24 AM, Darin Adler <[email protected] 
>>>> <mailto:[email protected]>> wrote:
>>>> 
>>>> I’ve noticed many patches switching us from std::function to WTF::Function 
>>>> recently, to fix problems with copying and thread safety.
>>>> 
>>>> Does std::function have any advantages over WTF::Function? Should we ever 
>>>> prefer std::function, or should we use WTF::Function everywhere in WebKit 
>>>> where we would otherwise use std::function?
>>>> 
>>>> — Darin
>>>> _______________________________________________
>>>> webkit-dev mailing list
>>>> [email protected] <mailto:[email protected]>
>>>> https://lists.webkit.org/mailman/listinfo/webkit-dev 
>>>> <https://lists.webkit.org/mailman/listinfo/webkit-dev>
>>> 
>>> _______________________________________________
>>> webkit-dev mailing list
>>> [email protected] <mailto:[email protected]>
>>> https://lists.webkit.org/mailman/listinfo/webkit-dev 
>>> <https://lists.webkit.org/mailman/listinfo/webkit-dev>
>> 
> 
> _______________________________________________
> webkit-dev mailing list
> [email protected]
> https://lists.webkit.org/mailman/listinfo/webkit-dev

_______________________________________________
webkit-dev mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to