Porting GDC to QNX

Sheff sheffmail at mail.ru
Fri Mar 30 05:44:01 PDT 2007


Sheff Wrote:

> Hi everyone, I'm porting GDC compiler, version 0.23 and GCC 4.1.1 to QNX Neutrino 6.3.0 SP1 (with GCC 3.3.5).
> The porting is almost done, GDC, GCC and Phobos are compiled and working fine, but you can't say the same for the programs, which GDC produces from D source code. So far I tested, I only spot one problem: posix threads. Consider the following example:
> 
> import std.stdio;
> import std.thread;
> 
> char[] string;
> 
> int th_func(void* arg)
> {
> 	const int num = 1_000_000;
> 
> 	for (int i=0; i<num; ++i)
> 	{
> 		string ~= "*";
> 	}
> 
> 	return 0;
> }
> 
> int main(char[][] args)
> {
> 	auto th = new Thread(&th_func, null);
> 	scope(exit)
> 		delete th;
> 
> 	th.start();
> 	th.wait();
> 
> 	writefln("end\n");
> 
>     return 0;
> }
> 
> When you run this program, it crashes with signal SIGUSR1, which's generated by pthread_join(), here's GDB output:
> 
> Program received signal SIGUSR1, User defined signal 1.
> [Switching to process 66433068]
> 0xb032f092 in ThreadJoin_r () from /usr/qnx630/target/qnx6/x86/lib/libc.so.2
> (gdb) bt
> #0  0xb032f092 in ThreadJoin_r ()
>    from /usr/qnx630/target/qnx6/x86/lib/libc.so.2
> #1  0xb031a801 in pthread_join ()
>    from /usr/qnx630/target/qnx6/x86/lib/libc.so.2
> Memory fault
> 
> But, if you'll replace the line:
> 
> const int num = 1_000_000;
> 
> with:
> 
> const int num = 100_000;
> 
> Then everything works fine, the "end" string gets printed, program successfuly exits. Consider another, similar example:
> 
> import std.stdio;
> import std.thread;
> 
> char[] string;
> 
> int th_func(void* arg)
> {
> 	const int num = 1_000_000;
> 
> 	for (int i=0; i<num; ++i)
> 	{
> 		string ~= "*";
> 	}
> 
> 	return 0;
> }
> 
> int main(char[][] args)
> {
> 	th_func(null);
> 
> 	writefln("end\n");
> 
>     return 0;
> }
> 
> As you can see, we have
> 
> const int num = 1_000_000;
> 
> here like in first example, which crashed, but this one doesn't, it works fine even if I write:
> 
> const int num = 50_000_000;
> 
> The conclusion I made from all this is that there's something wrong with threads, but I can't figure out what. Does anyone have any ideas ?

I think I understood what's the problem, the values of POSIX constants are different in linux and QNX (i.e O_CREAT, MAP_ANON, etc ), but in phobos they're defined like in linux, for example:
In phobos O_CREAT defined like:
const int O_CREAT = 0100; //0x64
In linux fcntl.h header:
#define  O_CREAT 0100 //0x64
but in QNX fcntl.h header it's defined like this:
#define  O_CREAT 0400 //0x100
0x64 != 0x100, so file creation always fails, so do other system calls.
What shall I do about it ? I don't want to manually redefine all POSIX constants...



More information about the Digitalmars-d mailing list