[swift-users] POSIX getaddrinfo memory behaviour
Mike Ferenduros
mike.ferenduros at gmail.com
Tue Oct 4 12:26:49 CDT 2016
Ach, apologies - I forgot that addrinfo contains pointers. Ignore what I
said :)
On Tuesday, October 4, 2016, Mike Ferenduros <mike.ferenduros at gmail.com>
wrote:
> Swift won't mess with memory it does't own, and memory the addrinfo list
> falls into that category.
>
> The addrinfo you're accessing through pointee is a struct which means
> that when you assign it somewhere you get a *copy* of the thing pointed to.
> Swift owns that copy and will manage it properly, and leave the original
> alone.
>
> Fwiw, this is the wrapper I'm using for sockets right now:
> https://github.com/mike-ferenduros/SwiftySockets
>
>
> On Tuesday, October 4, 2016, Etan Kissling via swift-users <
> swift-users at swift.org
> <javascript:_e(%7B%7D,'cvml','swift-users at swift.org');>> wrote:
>
>> POSIX getaddrinfo allocates memory that must later be freed using
>> freeaddrinfo.
>> See http://manpages.ubuntu.com/manpages/xenial/en/man3/getaddrinfo.3.html
>>
>> To simplify the API, I've created this function:
>>
>> import Foundation
>>
>> enum SystemError: Swift.Error {
>> case getaddrinfo(Int32, Int32?)
>> }
>>
>> public func getaddrinfo(node: String?, service: String?, hints:
>> addrinfo?) throws -> [addrinfo] {
>> var err: Int32
>> var res: UnsafeMutablePointer<addrinfo>?
>> if var hints = hints {
>> err = getaddrinfo(node, service, &hints, &res)
>> } else {
>> err = getaddrinfo(node, service, nil, &res)
>> }
>> if err == EAI_SYSTEM {
>> throw SystemError.getaddrinfo(err, errno)
>> }
>> if err != 0 {
>> throw SystemError.getaddrinfo(err, nil)
>> }
>> defer {
>> freeaddrinfo(res)
>> }
>> var result = [addrinfo]()
>> var ai = res?.pointee
>> while ai != nil {
>> result.append(ai!)
>> ai = ai!.ai_next?.pointee
>> }
>> return result
>> }
>>
>> I don't feel that the function is correct, though.
>>
>> • How can the Swift memory model know that getaddrinfo allocates memory,
>> and that Swift should not overwrite that memory with own stuff?
>> • How can Swift know that freeaddrinfo deletes the whole list, and that
>> it should copy out ai information that has been assigned to the result
>> array?
>>
>> What's the correct way to interface with getaddrinfo?
>>
>> Thanks
>>
>> Etan
>>
>>
>> _______________________________________________
>> swift-users mailing list
>> swift-users at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-users
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20161004/e13515ac/attachment.html>
More information about the swift-users
mailing list