> On Sep 7, 2017, at 11:57 AM, Taylor Swift <[email protected]> wrote:
> 
> 
> 
> On Thu, Sep 7, 2017 at 1:39 PM, Jordan Rose <[email protected] 
> <mailto:[email protected]>> wrote:
> 
> 
>> On Sep 7, 2017, at 10:31, Andrew Trick via swift-evolution 
>> <[email protected] <mailto:[email protected]>> wrote:
>> 
>> 
>>> On Sep 7, 2017, at 8:06 AM, Taylor Swift <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> 
>>> I don’t see any source for this claim in the documentation 
>>> <https://developer.apple.com/documentation/swift/unsafemutablepointer/2295090-deallocate>,
>>>  or the source code 
>>> <https://github.com/apple/swift/blob/master/stdlib/public/core/UnsafePointer.swift.gyb#L432>.
>>>  As far as I can tell the expected behavior is that partial deallocation 
>>> “should” work.
>>> 
>>> On Thu, Sep 7, 2017 at 8:59 AM, Joe Groff <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> 
>>> The segfaulting example is an incorrect usage. The only valid parameters to 
>>> deallocate(capacity:) are the base address of an allocation, and the 
>>> original capacity passed into allocate(); it has never been intended to 
>>> support partial deallocation of allocated blocks. It seems to me like this 
>>> proposal is based on a misunderstanding of how the API works. The 
>>> documentation and/or name should be clarified.
>>> 
>>> -Joe
>>> 
>>> > “fixing” this bug will cause programs that once operated on previously 
>>> > valid assumptions of “free()” semantics to behave differently, without 
>>> > any warnings ever being generated. Conversely incorrect code will 
>>> > suddenly become “correct” though this is less of a problem.
>>> >
>>> >> A sized implementation may fail more obviously when you violate the 
>>> >> contract in the future. Not having sized deallocation is a known 
>>> >> deficiency of the C model we've been fairly diligent about avoiding in 
>>> >> Swift's allocation interfaces, and it would be extremely unfortunate for 
>>> >> us to backpedal from it.
>>> >>
>>> >> -Joe
>> 
>> This discussion needs to be grounded by reiterating role of the API. 
>> UnsafePointer specifies the memory model without extraneous functionality or 
>> convenience.
>> 
>> The UnsafePointer.deallocate() API *is not*:
>> 
>> - a common, expected, or encouraged way to deallocate
>> 
>> - the simplest, safest, or most convenient way to deallocate
>> 
>> - necessarilly the most optimal path for deallocation
> 
> I don't think this is correct. UnsafePointer.deallocate is the API you must 
> use to deallocate memory allocated with UnsafePointer.allocate. My question 
> is whether it's acceptable to break all the people who didn't know this and 
> are using it to deallocate memory allocated with malloc or new on Apple 
> platforms. It sounds like the answer to that is "no, we want to be 
> malloc-compatible", and therefore the 'capacity' parameter isn't currently 
> serving a purpose today. We will always need to check if the memory is 
> actually in the Swift pool before even believing the 'capacity' parameter.
> 
> (It is definitely true that the intent was for this to be the allocation 
> capacity, and I'm surprised you interpreted it as supporting partial 
> deallocation. But we probably can't fix that at this point.)
> 
> Jordan
> 
>> 
>> There is only one decision that needs to be made here. Does the Swift 
>> runtime track allocation size for manually allocated blocks? I think the 
>> answer should be "yes", or at least haven't heard a strong argument against 
>> it. UnsafePointer.deallocate() needs to direcly reflect that model by making 
>> `allocatedCapacity` an *optional* argument.
>> 
>> Discussion about whether this API is unsafe, misleading, suboptimal or 
>> incorrectly implemented are secondary. Those are all deficiencies in the 
>> current documentation, current implementation, and availability of 
>> higher-level APIs.
>> 
>> Note that yesterday I argued that an optional argument wasn't worth the 
>> potential for confusion. That's true from a practical perspective, but I had 
>> lost sight of need to clearly specify the memory model. We want the Swift 
>> runtime to both have the functionality for tracking block size and also 
>> allow user code to track it more efficiently. Both those intentions need to 
>> be reflected in this API.
>> 
>> -Andy
>> _______________________________________________
>> swift-evolution mailing list
>> [email protected] <mailto:[email protected]>
>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
> 
> I mean I would have thought it’s reasonable to expect that if the method asks 
> for a capacity parameter, it will actually use it 

It will.

-Joe
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to