[swift-users] POSIX getaddrinfo memory behaviour

Mike Ferenduros mike.ferenduros at gmail.com
Tue Oct 4 12:24:33 CDT 2016


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> 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 <javascript:;>
> 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/a9e474d8/attachment.html>


More information about the swift-users mailing list