Am 21.11.2010, 19:47 Uhr, schrieb Peter Federighi <[email protected]>:

I'd still like to know if there's a better way/native way to trap C style signals in D. Or is there a D way of programming a timer and finding terminal window size
changes?

I don't think there are any D libraries to handle posix signals. Posix signals are a pita. In theory all functions you call in posix signal handlers must be signal safe and the requirements for that are very strict. Allocating memory in a signal handler is not safe for example. In practice, Linux for example is way more tolerant that the posix specification, so you often won't experience any problems with faulty signal handlers. Problems start to appear when you port to different OS which might be less forgiving. And as you're relying on unspecified features, a future update in kernel / external libraries could break your application.
(http://en.wikipedia.org/wiki/Signal_(computing)#Risks)

Because of these issues many people try to avoid signals whenever possible. If signals are needed the recommendation often is to use synchronous signal handling where all those issues don't exist. The key to synchronous signal handling is the sigwait function(http://linux.die.net/man/3/sigwait) but it blocks one thread all the time. Other possible solutions: signals can be managed with libev. I guess it uses synchronous signal handling internally, but it allows you to wait for an io event, signal, and other things in one thread. libev also has timers.

I've also seen an timer implementation which uses a mutex and condition variables with timeouts to simulate a timer. Works without signals or any special system support, but I don't know of an implementation for D.

The simplest(and least effective) possibility is to use a loop, Thread.sleep() and polling
//Pseudo code, functions might have other names ;-)
Size lastSize;
while(true)
{
    auto size = getWindowSize();
    if(size != lastSize)
    ...
    Thread.sleep(1000);
}

--
Johannes Pfau

Reply via email to