> On Nov 30, 2016, at 6:25 PM, Jiho Choi via swift-dev <swift-dev@swift.org> 
> wrote:
> 
> Thanks for clarifications.  I have a couple of follow-up questions.
> 
> 1. Could you please provide more information (e.g. source code location) 
> about the optimization applying non-atomic reference counting?  What's the 
> scope of the optimization?  Is it method-based?

The optimization itself is not merged yet. But all the required machinery, e.g. 
non-atomic versions of the ARC operations, special non-atomic flag on SIL 
instructions, etc is in place already.

As for the prototype implementation, you can find it here, on my local branch:
https://github.com/swiftix/swift/blob/30409865ff49a4268363cd359f82f29c9a90cce8/lib/SILOptimizer/Transforms/NonAtomicRC.cpp

> 
> 2. Looking at the source code, I assume Swift implements immediate reference 
> counting (i.e. immediate reclamation of dead objects)  without requiring 
> explicit garbage collection phase for techniques, such as deferred reference 
> counting or coalescing multiple updates.  Is it right?  If so, is there any 
> plan to implement such techniques?

Yes. It is a correct understanding. 
Different extensions like deferred reference counting were discussed, but there 
are no short-term plans to implement it anytime soon.

-Roman

> 
> On Wed, Nov 30, 2016 at 11:41 AM John McCall <rjmcc...@apple.com 
> <mailto:rjmcc...@apple.com>> wrote:
>> On Nov 30, 2016, at 8:33 AM, Jiho Choi via swift-dev <swift-dev@swift.org 
>> <mailto:swift-dev@swift.org>> wrote:
>> Hi,
>> 
>> I am new to Swift, and I have several questions about how ARC works in Swift.
>> 
>> 1. I read from one of the previous discussions in the swift-evolution list 
>> (https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160208/009422.html
>>  
>> <https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160208/009422.html>)
>>  that ARC operations are currently not atomic as Swift has no memory model 
>> and concurrency model.  Does it mean that the compiler generates non-atomic 
>> instructions for updating reference counts (e.g. using incrementNonAtomic() 
>> instead of increment() in RefCount.h)?
> 
> No.  We have the ability to do non-atomic reference counting as an 
> optimization, but we only trigger it when we can prove that an object hasn't 
> escaped yet.  Therefore, at the user level, retain counts are atomic.
> 
> Swift ARC is non-atomic in the sense that a read/write or write/write race on 
> an individual property/variable/whatever has undefined behavior and can lead 
> to crashes or leaks.  This differs from Objective-C ARC only in that a 
> (synthesized) atomic strong or weak property in Objective-C does promise 
> correctness even in the face of race conditions.  But this guarantee is not 
> worth much in practice because a failure to adequately synchronize accesses 
> to a class's instance variables is likely to have all sorts of other 
> unpleasant effects, and it is quite expensive, so we decided not to make it 
> in Swift.
> 
>> 2. If not, when does it use non-atomic ARC operations? Is there an 
>> optimization pass to recognize local objects?
>> 
>> 3. Without the concurrency model in the language, if not using GCD (e.g. all 
>> Swift benchmark applications), I assume Swift applications are 
>> single-threaded.  Then, I think we can safely use non-atomic ARC operations. 
>>  Am I right?
> 
> When we say that we don't have a concurrency model, we mean that (1) we 
> aren't providing a more complete language solution than the options available 
> to C programmers and (2) like C pre-C11/C++11, we have not yet formalized a 
> memory model for concurrency that provides formal guarantees about what 
> accesses are guaranteed to not conflict if they do race.  (For example, we 
> are unlikely to guarantee that accesses to different properties of a struct 
> can occur in parallel, but we may choose to make that guarantee for different 
> properties of a class.)
> 
>> 4. Lastly, is there a way to measure the overhead of ARC (e.g. a compiler 
>> flag to disable ARC)?
> 
> No, because ARC is generally necessary for correctness.
> 
> John.
> _______________________________________________
> swift-dev mailing list
> swift-dev@swift.org
> https://lists.swift.org/mailman/listinfo/swift-dev

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

Reply via email to