////////////////////////////////////////////////////////////
//
//     	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;
}