//
// @(#)Real Time Threads 0.5			prasad@watson.ibm.com:jul97

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "shmalloc.h"

// ----------------------------------------------------------------------------

#include "values.h"			// values.h
#include "lock.h"			// lock.h
#include "rtime.h"			// rtime.h
#include "rthread.h"			// rthread.h
#include "rtask.h"			// rtask.h

// ----------------------------------------------------------------------------

class Rtbase : public Lock {

	char	*version;
	int	tasks;			// stats
	int	actives;		
	int	ids;

	int	pid;			// demon's, for wakey wakey
	int	memid;			// shmid
	int	woken;			// signal latch
	int	sigpause, sigresume;	// signals to use (SIGTERM,0=isBusy)

	RtThread *list, *wakeup;

friend class RtThread;

public:
	static Syserror RtError;

	static Rtbase* Create (const char* path,
				int size, int mode, int intvl =0)
		throw (Syserror);

	static Rtbase* Attach (int shmid)
		throw (Syserror);

	int shmid () const		{ return memid; }
	int ntasks () const		{ return tasks; }
	int nactive () const		{ return actives; }

	void Signals (int pause, int resume) {
					sigpause  = pause;
					sigresume = resume;
					}

	void NoSignals ()		{ sigpause = 0; }

	int Literate () const		{ return ! sigpause; }

		// work one queue
	void RunId (int id, const char* file, char** args)
		throw (RtThread);

		// work through all queues ones
	void RunOnce (const char* file, char** args)
		throw ();

		// cron-like loop, set to run every so many ms
	void Run (char* file, char** args, int msec =10000)
		throw ();

	void Wakeup () throw ();
	void StopAll () throw ();	// immediately

	const char* Version () 		{ return version; }

friend ostream& operator << (ostream&, const Rtbase&);
	};

ostream& operator << (ostream&, const Rtbase&);

// ----------------------------------------------------------------------------