So trivially we could do something along these lines to “solve it” in 
swift-corelibs-foundation instead of polluting the swift standard library with 
objective-c-isms on Linux. 

internal class NSAutoreleasePool {
    fileprivate static var _current = NSThreadSpecific<NSAutoreleasePool>()
    internal static var current: NSAutoreleasePool {
        return _current.get() {
            return NSAutoreleasePool()
        }
    }
    
    var depth: Int = 0
    var objects = [[AnyObject]]()
    
    fileprivate override init() { }
    
    fileprivate func push() {
        objects.append([AnyObject]())
        depth += 1
    }
    
    fileprivate func pop() {
        objects.removeLast()
        depth -= 1
    }
    
    func add(_ object: AnyObject) {
        objects[depth - 1].append(object)
    }
}

public func autoreleasepool(_ code: () -> ()) {
    NSAutoreleasePool.current.push()
    code()
    NSAutoreleasePool.current.pop()
}


> On Nov 2, 2016, at 12:23 PM, Philippe Hausler via swift-users 
> <swift-users@swift.org> wrote:
> 
> So there are issues we have in swift-corelibs that suffer(leak) because we 
> don't have ARPs on Linux. It would be super nice to have a retain until scope 
> end concept for swift core libs where autorelease would be an accessor in 
> unmanaged that would retain the object until the arp ends scope.
> 
> Sent from my iPhone
> 
> On Nov 2, 2016, at 10:17 AM, Jordan Rose <jordan_r...@apple.com 
> <mailto:jordan_r...@apple.com>> wrote:
> 
>> 
>>> On Nov 2, 2016, at 09:42, Joe Groff via swift-users <swift-users@swift.org 
>>> <mailto:swift-users@swift.org>> wrote:
>>> 
>>>> 
>>>> On Nov 1, 2016, at 6:40 PM, Bernardo Breder via swift-users 
>>>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>>>> 
>>>> Hello,
>>>> 
>>>> I want to create a mini http server project and execute at Ubuntu 15. The 
>>>> Xcode compile and access the function "autoreleasepool", but when i 
>>>> compile the same code at Ubuntu, this function not found
>>>> 
>>>> For example, i can compile the code above at Xcode:
>>>> 
>>>> while true {
>>>>    autoreleasepool {
>>>>    var test: Data = "HTTP/1.1 200 OK\r\nContent-Length: 
>>>> 1\r\n\r\na".data(using: .utf8)!
>>>>    }
>>>> }
>>>> 
>>>> But when i try to compile at Ubuntu:
>>>> 
>>>> git@breder:~$ cat main.swift     
>>>> import Foundation
>>>> 
>>>> while true {
>>>>    autoreleasepool {
>>>>    var test: Data = "HTTP/1.1 200 OK\r\nContent-Length: 
>>>> 1\r\n\r\na".data(using: .utf8)!
>>>>    }
>>>> }
>>>> 
>>>> git@breder:~$ swiftc main.swift 
>>>> main.swift:4:5: error: use of unresolved identifier 'autoreleasepool'
>>>>    autoreleasepool {
>>>>    ^~~~~~~~~~~~~~~
>>> 
>>> Autoreleasepools are an ObjC compatibility feature. They aren't necessary 
>>> in standalone Swift.
>> 
>> But they are necessary in Swift programs on Apple platforms (that don’t use 
>> RunLoop, anyway). Philippe, what do you think? What’s the right way to write 
>> cross-platform code that doesn’t use RunLoop or dispatch_main for an 
>> implicit autorelease pool?
>> 
>> (/me remembers +[NSAutoreleasePool drain] from the ObjC-GC days)
>> 
>> Jordan
> _______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

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

Reply via email to