> Le 26 sept. 2017 à 22:38, Pierre Habouzit <phabou...@apple.com> a écrit :
> 
>> On Sep 26, 2017, at 11:22 AM, Jean-Daniel via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>>> Le 26 sept. 2017 à 00:13, Adam Kemp <adam_k...@apple.com 
>>> <mailto:adam_k...@apple.com>> a écrit :
>>> 
>>>> On Sep 25, 2017, at 3:04 PM, Jean-Daniel via swift-evolution 
>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>> 
>>>>> Le 25 sept. 2017 à 21:42, John McCall via swift-evolution 
>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> a écrit :
>>>>> 
>>>>> This doesn't have to be the case, actually.  The intrinsics as Chris 
>>>>> described them wouldn't be sufficient, but you could require a "current 
>>>>> queue" to be provided when kicking off an async function from scratch, as 
>>>>> well as any other "async-local" context information you wanted (e.g. QoS 
>>>>> and the other things that Dispatch tracks with attributes/flags that are 
>>>>> generally supposed to persist across an entire async operation).
>>>>> 
>>>> 
>>>> My response was about the ‘implicitly’ part. I hope we will get a rich API 
>>>> that let us specify return queue, QoS and more, but how do you plan to 
>>>> fulfill the « current queue » requirement implicitly ?
>>> 
>>> My earlier response to this thread both linked to a previous thread about 
>>> this and explained how C# does it. It will require some library support, 
>>> but it can be done, and IMO should be done. As I’ve stressed repeatedly, 
>>> async/await without this behavior will be very difficult to use correctly. 
>>> I really hope we don’t settle for that.
>> 
>> In C#, the model is far simple as there is not concept of a single dispatch 
>> queue that can execute work on any thread. You can easily use TLS to store a 
>> default context. Each UI thread can have a context that dispatch completion 
>> on the message queue, but AFAIK,
> 
> 
>> there is not DispatchQueue Local Storage yet.
> 
> There is, see dispatch_queue*_specific()
> 
>> Even something as simple as getting the current queue is not reliable (see 
>> dispatch_get_current_queue man page for details).
> 
> This is a sharp construct for clients, but not for the runtime / compiler 
> that can be taught how not to fall in the traps of this API.
> 
> Just to debunk myths, dispatch_get_current_queue() is VERY WELL defined, but 
> has two major issues: nesting & refcounting.
> 
> 
> Nesting
> 
> Nesting refers to the fact that when you call code that takes a queue and a 
> callback, you may observe *another* queue:
> 
> run_something_and_call_me_back(arg1, arg2, on_queue, ^{
>     assert(dispatch_get_current_queue() == on_queue); // may crash
>     ... my stuff ...
> });
> 
> The reason is that run_something_and_call_me_back() may create a queue that 
> targets `on_queue` and then this private queue is what is returned which is 
> both unexpected and exposing internals of the implementation of 
> run_something_and_call_me_back() which is all wrong.
> 
> A corollary is that people attempting to implement recursive locking (which 
> is a bad idea in general anyway) with dispatch_get_current_queue() will fail 
> miserably.
> 
> Refcounting
> 
> Because dispatch has a notion of internal refcount, in ARC world, this will 
> crash most of the time:
> 
> dispatch_async(dispatch_queue_create_with_target("foo", NULL, NULL), ^{
>     __strong dispatch_queue cq = dispatch_get_current_queue(); // will 
> usually crash with a resurrection error
> });
> 
> 
> These two edges is why we deprecated this interface for humans.
> 
> 1) A compiler though is not affected by the first issue because the context 
> it would capture would have to not be programatically accessible to clients
> 2) The Swift runtime can know to take "internal" refcounts when capturing 
> this hidden pointer and is not affected by the second problem either.
> 
> 
> tl;dr: what is badly defined is allowing clients to get a pointer to the 
> current queue with a real +1, but that is WAY stronger than what the language 
> runtime needs.
> 
> 
>> That’s why I’m saying it will be difficult to define a reasonable default 
>> context that can be used implicitly.
> 
> This is just not true. This is both easy and reasonable.
> 

I’m glade to be wrong about that point ;-)
One issue I still see is what should be the default when running on a bare 
pthread outside of any queue context. Or is there a queue associated with any 
thread ?


_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to