This function works flawlessly in Release build:

func markAndTell( talk: Bool, number: Int)
{
        let nbrOfThreads = 8
        let step = 2
        let itemsPerThread = number * step
        let bitLimit = nbrOfThreads * itemsPerThread
        var bitfield = [Bool](count: bitLimit, repeatedValue: false)

        let queue = dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_HIGH, 0 
);
        dispatch_apply( Int(nbrOfThreads), queue,
                { ( idx: size_t) -> Void in
                        
                        let startIndex = itemsPerThread * Int(idx)
                        let endIndex = min( startIndex + itemsPerThread, 
bitLimit )
                        if talk { print("Thread[\(idx)] does \(startIndex) ..< 
\(endIndex)")}
                        
                        var currIndex = startIndex
                        while( currIndex < endIndex )
                        {
                                bitfield[currIndex] = true      //      this 
might crash
                                currIndex += step
                        }
                }
        )
}

But it does not work in Debug builds.

“does not work” means: for !talk and any number > 0 or: talk and number ≥ 110:

malloc: *** error for object 0x101007808: incorrect checksum for freed object 
- object was probably modified after being freed. *** set a breakpoint in 
malloc_error_break to debug

Or:
fatal error: UnsafeMutablePointer.initializeFrom non-following overlapping range

Or:
just plain wrong data in bitfield.

So: is the code ok and the compiler broken in Debug mode?
Or is the code fundamentally wrong and that it works in Release is just a fluke?
If so: how could it be fixed?

Btw.: no problems with bitfield malloced into some UnsafeMutablePointer<UInt8>.

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

Reply via email to