[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