////////////////////////////////////////////////////////////
//
// Implementation of classes
// ASignalThread, ASignalThreadControl
//
// Copyright 2001 Alexander Liss
//
////////////////////////////////////////////////////////////
#include <signal.h>
#include "AFifo.C"
#include "AEvent.h"
#include "AWait.h"
#include "AProcess.h"
#include "ASignalThread.h"
#include <stdio.h>
// global data
AEvent G_signal_event;
AFifo<int> G_signal_code_fifo;
// ASignalThread_signal_handler
static
void ASignalThread_signal_handler(int z)
{
G_signal_code_fifo.push(z);
G_signal_event.signal();
}
// ASignalThread
int ASignalThread::catch_signal(int signal_code)
{
// to do check signal_code
// install our handler ASignalThread_signal_handler()
signal(signal_code,ASignalThread_signal_handler);
return 0;
}
int ASignalThread::catch_signal_again(int signal_code)
{
// install our ASignalThread_handler signal_handler()
signal(signal_code,ASignalThread_signal_handler);
return 0;
}
int ASignalThread::loop(bool& continue_loop)
{
continue_loop=true;
int signal_code=0;
while(G_signal_code_fifo.pop(signal_code))
{
if(destruct) break;
AWait(G_signal_event);
}
if(destruct) return 0;
do process_signals(signal_code);
while(! G_signal_code_fifo.pop(signal_code) );
return 0;
}
// ASignalThreadControl
ASignalThreadControl::~ASignalThreadControl()
{
if(thread_object)
thread_object->selfdestruct();
G_signal_event.signal();
// unsigned left;
//millisleep(left,1000);
terminate();
}
int ASignalThreadControl::launch_signal_thread(ASignalThread& z)
{
int g=launch(z);
if(!g) g=detach();
return g;
}