[Issue 8774] 2.059 worked 2.060 does not: nested delegate memory	corruption
    d-bugmail at puremagic.com 
    d-bugmail at puremagic.com
       
    Wed Dec 26 03:57:14 PST 2012
    
    
  
http://d.puremagic.com/issues/show_bug.cgi?id=8774
Dmitry Olshansky <dmitry.olsh at gmail.com> changed:
           What    |Removed                     |Added
----------------------------------------------------------------------------
            Summary|2.059 worked 2.060 does     |2.059 worked 2.060 does
                   |not: Unable to join thread  |not: nested delegate memory
                   |                            |corruption
--- Comment #16 from Dmitry Olshansky <dmitry.olsh at gmail.com> 2012-12-26 03:57:08 PST ---
Okay I drilled this down and the bug is not related to threading.
Short-list for Russel: 
- the bug in the original code is fixed by .array on result of map 
- to workaround a strange stackframe corruption bug pass 'i' instead of 'ii' in
partialSum and it works.
Now on to the real problem discovered, I guess Walter has some work to do
though as it doesn't look related to threading and run-time at all.
The minimized test case with threading removed,
shows that variable sliceSize gets corrupted:
import std.stdio;
import std.algorithm;
import std.range;
int sliceBefore;
void partialSum ( immutable int id , immutable int sliceSize , immutable double
delta ) {
  writeln("PSUM: ", id, "  SLICE: ", sliceSize, " DELTA:", delta); 
  assert(sliceSize == sliceBefore);
}
void corrupt( immutable int numberOfThreads ) {
    immutable n = 1000000000 ;
    immutable delta = 1.0 / n ;      
    immutable sliceSize = n / numberOfThreads ;
    sliceBefore = sliceSize;
    writeln("REAL SLICE SIZE: ", sliceSize);
    auto threads = map ! ( ( int i ) {
        auto closedPartialSum ( ) {
            immutable ii = i ;
            return delegate ( ) {     
                                //change ii to i and it works            
                partialSum (ii , sliceSize , delta ) ;
            };
        }
        return closedPartialSum;     
    }) ( iota ( numberOfThreads ) ).array;
    foreach(dg; threads)
        dg();
}
void main(){
  corrupt(1);
}
Yields the following (exact corrupted number in SLICE varies):
REAL SLICE SIZE: 1000000000
PSUM: 0  SLICE: 1588842464 DELTA:1e-09
core.exception.AssertError at quadrature(15): Assertion failure
....
Can somebody having 2.059 check if this simplified test case passes there.
-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
    
    
More information about the Digitalmars-d-bugs
mailing list