www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Global extern(C) in druntime header files?

reply "Gary Willoughby" <dev kalekold.net> writes:
I've been doing some coding and noticed something strange with 
core.sys.posix.signal. In the following snippet you will see that 
i have to decorate the handleTermination function with extern(C) 
to satisfy the type requirements of the bsd_signal function.

import core.sys.posix.signal;
import std.c.stdlib;
import std.stdio;

void main(string[] args)
{
	bsd_signal(SIGINT, &handleTermination);

	while (true)
	{
		
	}
}

extern(C) void handleTermination(int signal)
{
	writefln("Caught signal: %s", signal);
	exit(signal);
}

This seems really odd until you take a look at the header file. 
In signal.d you will see extern(C): specified at the top and then 
further down this:

    private alias void function(int) sigfn_t;

essentially decorating this alias with extern(C).

Is this right? Should this alias be decorated like that in the 
header file?
Jun 05 2013
parent reply "Jesse Phillips" <Jesse.K.Phillips+D gmail.com> writes:
Not going to look into the file, but I'm pretty sure bsd_signal 
is function for an external C library right?

If that is the case, it must use C calling convention, so yes 
this is correct.
Jun 05 2013
parent reply "Gary Willoughby" <dev kalekold.net> writes:
On Wednesday, 5 June 2013 at 18:54:45 UTC, Jesse Phillips wrote:
 Not going to look into the file, but I'm pretty sure bsd_signal 
 is function for an external C library right?

 If that is the case, it must use C calling convention, so yes 
 this is correct.
Ah sorry i wasn't clear. The question i have is, why do i need to decorate the function (with extern(C)) that i pass to bsd_signal. The only reason i can see is that the type hint is decorated but surely it doesn't need to be.
Jun 05 2013
parent reply "Mike Parker" <aldacron gmail.com> writes:
On Wednesday, 5 June 2013 at 20:40:59 UTC, Gary Willoughby wrote:
 On Wednesday, 5 June 2013 at 18:54:45 UTC, Jesse Phillips wrote:
 Not going to look into the file, but I'm pretty sure 
 bsd_signal is function for an external C library right?

 If that is the case, it must use C calling convention, so yes 
 this is correct.
Ah sorry i wasn't clear. The question i have is, why do i need to decorate the function (with extern(C)) that i pass to bsd_signal. The only reason i can see is that the type hint is decorated but surely it doesn't need to be.
You are passing a function pointer to a C library, where it will be expected that the function uses the C calling convention. So you have to declare the function as extern(C), otherwise DMD will not compile it as such. That can cause segfaults.
Jun 05 2013
parent "Gary Willoughby" <dev kalekold.net> writes:
 You are passing a function pointer to a C library, where it 
 will be expected that the function uses the C calling 
 convention. So you have to declare the function as extern(C), 
 otherwise DMD will not compile it as such. That can cause 
 segfaults.
Right ok thanks.
Jun 06 2013