Re: Segfault in _d_dynamic_cast ()

2013-01-25 Thread Minas Mina

I found what the root of all evil was - The GC.

After disabling it, the program runs fine.


Re: Segfault in _d_dynamic_cast ()

2013-01-25 Thread Maxim Fomin

On Friday, 25 January 2013 at 15:15:32 UTC, Minas Mina wrote:

I found what the root of all evil was - The GC.

After disabling it, the program runs fine.


Perhaps you was working with C code, GC + legacy code sometimes 
lead to logical memory errors. However GC per se is unlikely to 
cause any errors (I remember Walter was telling that neither he 
nor anybody faced issues with GC). Also your code may still have 
errors but absence of GC hides them.


Re: Segfault in _d_dynamic_cast ()

2013-01-25 Thread Minas Mina
Maybe. I am re-writing the code in C++ to see, and also to 
compare the performance.


Re: Segfault in _d_dynamic_cast ()

2013-01-25 Thread Minas Mina

On Friday, 25 January 2013 at 16:19:15 UTC, Maxim Fomin wrote:

On Friday, 25 January 2013 at 15:15:32 UTC, Minas Mina wrote:

I found what the root of all evil was - The GC.

After disabling it, the program runs fine.


Perhaps you was working with C code, GC + legacy code sometimes 
lead to logical memory errors. However GC per se is unlikely to 
cause any errors (I remember Walter was telling that neither he 
nor anybody faced issues with GC). Also your code may still 
have errors but absence of GC hides them.


I have written the same program in C++ -- and I get no seg-fault. 
Well I don't know for sure that something isn't wrong with my 
code, but I suspect it is the GC that is messing things up.


Re: Segfault in _d_dynamic_cast ()

2013-01-25 Thread David
 I have written the same program in C++ -- and I get no seg-fault. Well I
 don't know for sure that something isn't wrong with my code, but I
 suspect it is the GC that is messing things up.

This is definitly possible, I also had random segfaults GC related. It
worked fine on my PC, but crashed on someone elses Ubuntu (same DMD
version, same architecture). I also had random crashes in threads when
they were about to finish, GC.disable() solved it, also rewriting the
whole code (fortunatly I had to do that anyways)


Segfault in _d_dynamic_cast ()

2013-01-24 Thread Minas Mina
I am trying to create a BVH tree structure to speed up 
raytracing. So far it has been fine. I have created the BVH tree. 
It works for 202 triangles/spheres.


However, when the scene has more spheres/triangles, I get a 
segmentation fault when the rays are traces, not when the tree is 
being built.


To let you understand, there is a Surface class, from which 
BVHNode, Sphere and Triangle inherit.


I have written a small function that prints the BVH tree 
recursively. Here it is:


void printBVH(Surface root, int i = 0, string str = )
{
if( root is null )
return;

writeln(--PRINT()--);
writeln(icy);//writeln(root.boundingBox());
writeln(name = , root.name,  depth = , i,  [, str, ]);
writeln(--~~~--\n);

if( (cast(BVHNode)root) !is null ) // OOPS! SEG FAULT HERE
{
printBVH((cast(BVHNode)(root)).left, i+1, left);
printBVH((cast(BVHNode)(root)).right, i+1, right);
}
}

And I pass to printBVH() the root node that the function that 
builds the tree has returned.


// replaces every two Surfaces with one that is their parent. 
Proceeds until there is only one surface, which is the root.
BVHNode createBVHTree2(Surface[] objects, ubyte axis = 0, int 
depth = 0)

{
import std.algorithm, std.stdio;

BVHNode root;

// sort left out for now until the seg fault is fixed
	//sort!((a.boundingBox().min.x + a.boundingBox().max.x) * 0.5f 
 (b.boundingBox().min.x + b.boundingBox().max.x) * 0.5f, 
SwapStrategy.unstable)(objects);


while( objects.length  1 )
{
writeln(--- Level ---);
foreach(o; objects)
write([, o.name, ] );
writeln();

auto temp = new Surface[objects.length/2 + 1];
auto sz = 0UL;

for(auto i = 0UL; i  objects.length; i += 2)
{
writeln(i = , i,  sz = , sz+1);

BVHNode parent = new BVHNode();
parent.name = p;

parent.left = objects[i];
if( i + 1  objects.length )
{   
parent.right = objects[i+1];

auto box1 = objects[i].boundingBox(), box2 = 
objects[i+1].boundingBox();

parent.box = combine(box1, box2);
}
else
{
parent.right = null;
parent.box = objects[i].boundingBox();
}

temp[sz++] = parent;
}

temp.length = sz;
objects = temp;
}

root = cast(BVHNode)objects[0];

return root;
}

Ok, so when I print the scene using printBVH(), I get a segfault 
in the line:

if( (cast(BVHNode)root) !is null )

GDB says: Program received signal SIGSEGV, Segmentation fault.
0x004b55fc in _d_dynamic_cast ()

Note that I have written the createBVHTree() and printBVH() 
functions in Java to see if it would be different. The code works 
in Java. I guess something is wrong with the compiler here and 
the way it handles recursion(?) -- By the way the code seg faults 
at the 11 depth level. Are there any know bugs for this?


Thanks.


Re: Segfault in _d_dynamic_cast ()

2013-01-24 Thread Maxim Fomin

On Thursday, 24 January 2013 at 10:14:29 UTC, Minas Mina wrote:
I am trying to create a BVH tree structure to speed up 
raytracing. So far it has been fine. I have created the BVH 
tree. It works for 202 triangles/spheres.


skipped

Thanks.


Requests for debugging help without source code are likely to be 
buried in archives silently. Perhaps you can look at 
_d_dynamic_cast source code 
(https://github.com/D-Programming-Language/druntime/blob/master/src/rt/cast_.d#L69) 
and figure out the exact statement which produces segfault.


Re: Segfault in _d_dynamic_cast ()

2013-01-24 Thread Minas Mina

On Thursday, 24 January 2013 at 13:22:20 UTC, Maxim Fomin wrote:

On Thursday, 24 January 2013 at 10:14:29 UTC, Minas Mina wrote:
I am trying to create a BVH tree structure to speed up 
raytracing. So far it has been fine. I have created the BVH 
tree. It works for 202 triangles/spheres.


skipped

Thanks.


Requests for debugging help without source code are likely to 
be buried in archives silently. Perhaps you can look at 
_d_dynamic_cast source code 
(https://github.com/D-Programming-Language/druntime/blob/master/src/rt/cast_.d#L69) 
and figure out the exact statement which produces segfault.


The code can be found here:
https://github.com/minas1/D_Raytracing

The code that creates the BVH tree is in bvh.d.
The code that prints the tree is in main.d.