# Sigusr2 reference

When a thread is requested to die, its registered file descriptors become revoked, and the signal

    SIGUSR2

is sent to it to interrupt any ongoing system calls. For this to work correctly, there must be a signal handler defined on

    SIGUSR2

, because otherwise the default reaction to it is to kill the process. It doesn't matter what signal handler, just some handler must be there. The Triceps library defines an empty signal handler but you can also define your own instead.

In Perl, the empty handler for

    SIGUSR2

is set when the module

    Triceps.pm

is loaded. You can change it afterwards.

In &Cpp; Triceps provides a class Sigusr2, defined in

    app/Sigusr2.h

, to help with this. All the methods of Sigusr2 are static. If you use the class BasicPthread, you don't need to deal with Sigusr2 directly: BasicPthread takes care of it.

    static void setup();

Set up an empty handler for

    SIGUSR2

if it hasn't been done yet. This class has a static flag (synchronized by a mutex) showing that the handler had been set up. On the first call it sets the handler and sets the flag. On the subsequent calls it checks the flag and does nothing.

    static void markDone();

Just set the flag that the setup has been done. This allows to set your own handler instead and still cooperate with the logic of Sigusr2 and BasicPthread.

If you set your custom handler before any threads have been started, then set up your handler and then call

    markDone()

, telling Sigusr2 that there is no need to set the handler any more.

If you set your custom handler when the Triceps threads are already running (not the best idea but still a possibility), there is a possibility of a race with another thread calling

    setup()

. To work around that race, set up your handler, call

    markDone()

, then set up your handler again.

    static void reSetup();

This allows to replace a custom handler with the empty one. It always forcibly sets the empty handler (and also the flag).

SIGUSR2