#ifndef LIBRARIES_SYSINFO_H
#define LIBRARIES_SYSINFO_H

/*
**      $VER: SysInfo.h 1.30 (14.11.95)
**      SysInfo Release 1.30
**
**      SysInfo.library definitions
**
**      This file is public domain.
**
**      Author: Petri Nordlund <petrin@megabaud.fi>
**
**      $Id: SysInfo.h 1.3 1995/11/14 13:00:29 petrin Exp petrin $
**
*/

#ifndef EXEC_TYPES_H
#include "exec/types.h"
#endif /* EXEC_TYPES_H */

#ifndef EXEC_PORTS_H
#include "exec/ports.h"
#endif /* EXEC_PORTS_H */


#define SYSINFONAME		"SysInfo.library"
#define SYSINFOVERSION	1L


/*
 * This structure is returned by InitSysInfo() and it's READ-ONLY.
 *
 * NOTE!! This structure will grow in the future, so don't make any assumptions
 * about it's length.
 *
 */

struct SysInfo {
/* general */
	LONG	errno;					/* Used to hold error values 				*/
									/* from some functions						*/
/* load average */
	UWORD	loadavg_type;			/* load average type, see below				*/
	UWORD	loadavg_time1;			/* Usually 1, 5 and 15 minutes.				*/
	UWORD	loadavg_time2;			/* These times are in seconds.				*/
	UWORD	loadavg_time3;			/* 0 = time not implemented					*/
	UWORD	fscale;					/* scale value, if lavgtype = FIXED	 		*/

/* id */
	BOOL	GetPpid_implemented;	/* TRUE if GetPpid is implemented			*/
	BOOL	GetPgrp_implemented;	/* TRUE if GetPgrp is implemented			*/

/* get/setnice */
	UWORD	which_implemented;		/* Search methods for Get/SetNice			*/
	WORD	nicemin;				/* Nice-value giving most cpu time			*/
	WORD	nicemax;				/* Nice-value giving least cpu time			*/

/* notify */
	BOOL	notify_sig_implemented;	/* Notify by signal implemented				*/
	BOOL	notify_msg_implemented;	/* Notify by message implemented			*/

/* cpu usage */
	UWORD	cpu_usage_implemented;	/* What cpu usage values are implemented	*/

/* task cpu usage */
	UWORD	task_cpu_usage_implemented;	/* What cpu usage values are implemented*/

	LONG	reserved[8];			/* Reserved for future use					*/
};


/*
 * general
 *
 */

/* errno values */
#define	WHICH_EPERM			1		/* Operation not permitted */
#define	WHICH_ESRCH			3		/* No such process */
#define	WHICH_EACCES		13		/* Permission denied */
#define	WHICH_EINVAL		22		/* Invalid argument */


/*
 * load average
 *
 */

/* LoadAverage type */
#define LOADAVG_NONE		0		/* Load averages not implemented			*/
#define LOADAVG_FIXEDPNT	1		/* Load * SysInfo->fscale 					*/

/* GetLoadAverage */
struct SI_LoadAverageFixed {
	ULONG	load1;
	ULONG	load2;
	ULONG	load3;
};

/* This is needed when calling GetLoadAverage() */
struct SI_LoadAverage {
	struct SI_LoadAverageFixed	lavg_fixed;
	LONG						reserved[3];	/* Reserved for future use */
};

/*
 * get/setnice
 *
 */

/* Possible search methods for Get/SetNice */
#define WHICH_PRIO_PROCESS		0
#define WHICH_PRIO_PGRP			1
#define WHICH_PRIO_USER			2
#define WHICH_PRIO_TASK			3

/* These bits are used in which_implemented-field */
#define WHICHB_PRIO_PROCESS		0
#define WHICHB_PRIO_PGRP		1
#define WHICHB_PRIO_USER		2
#define WHICHB_PRIO_TASK		3

#define WHICHF_PRIO_PROCESS		(1L<<0)
#define WHICHF_PRIO_PGRP		(1L<<1)
#define WHICHF_PRIO_USER		(1L<<2)
#define WHICHF_PRIO_TASK		(1L<<3)


/*
 * notify
 *
 */

/* This is needed when adding a notify-request. This may grow in future */
struct SI_Notify {
	struct MsgPort		*notify_port;	/* Message port for notify-messages		*/
	WORD				signal;			/* Signal NUMBER if you use signals		*/
	LONG				reserved[2];	/* Reserved for future use				*/
};

/* Flags for AddNotify () */
#define AN_USE_MESSAGES		(1<<0)


/*
 * cpu usage
 *
 */

/* This is needed when querying cpu usage */
struct SI_CpuUsage {
	ULONG	total_used_cputime;			/* Total used cputime in seconds		*/
	ULONG	total_elapsed_time;			/* Total used+idle cputime in seconds	*/

	ULONG	used_cputime_lastsec;		/* Used cputime during last second		*/
	ULONG	used_cputime_lastsec_hz;	/* 100 * lastsec / lastsec_hz = CPU %	*/

	ULONG	recent_used_cputime;		/* Recently used cputime				*/
	ULONG	recent_used_cputime_hz;		/* 100 * recent / hz = RECENT CPU %		*/
	UWORD	recent_seconds;				/* "recent" means this many seconds		*/

	ULONG	involuntary_csw;			/* Involuntary context switches 		*/
	ULONG	voluntary_csw;				/* Voluntary context switches			*/
	ULONG	total_csw;					/* Total # of context switches			*/

	ULONG	involuntary_csw_lastsec;	/* Involuntary csws during last second  */
	ULONG	voluntary_csw_lastsec;		/* Voluntary csws during last second	*/
	ULONG	total_csw_lastsec;			/* Total # of csws during last second	*/

	LONG	reserved[12];				/* Reserved for future use				*/
};

/* These bits are used in cpu_usage_implemented-field */
#define CPU_USAGEB_TOTAL_IMPLEMENTED			0
#define CPU_USAGEB_LASTSEC_IMPLEMENTED			1
#define CPU_USAGEB_RECENT_IMPLEMENTED			2
#define CPU_USAGEB_IVVOCSW_IMPLEMENTED			3
#define CPU_USAGEB_TOTALCSW_IMPLEMENTED			4
#define CPU_USAGEB_IVVOCSW_LASTSEC_IMPLEMENTED	5
#define CPU_USAGEB_TOTALCSW_LASTSEC_IMPLEMENTED	6

#define CPU_USAGEF_TOTAL_IMPLEMENTED			(1L<<0)
#define CPU_USAGEF_LASTSEC_IMPLEMENTED			(1L<<1)
#define CPU_USAGEF_RECENT_IMPLEMENTED			(1L<<2)
#define CPU_USAGEF_IVVOCSW_IMPLEMENTED			(1L<<3)
#define CPU_USAGEF_TOTALCSW_IMPLEMENTED			(1L<<4)
#define CPU_USAGEF_IVVOCSW_LASTSEC_IMPLEMENTED	(1L<<5)
#define CPU_USAGEF_TOTALCSW_LASTSEC_IMPLEMENTED	(1L<<6)


/*
 * task cpu usage
 *
 */

/* This is needed when querying cpu usage of a task */
struct SI_TaskCpuUsage {
	ULONG	total_used_cputime;			/* Total used cputime  					*/
	ULONG	total_used_time_hz;			/* used_cputime / hz = cputime in secs	*/
	ULONG	total_elapsed_time;			/* Total used+idle cputime in seconds   */

	ULONG	used_cputime_lastsec;		/* Used cputime during last second		*/
	ULONG	used_cputime_lastsec_hz;	/* 100 * lastsec / lastsec_hz = CPU %	*/

	ULONG	recent_used_cputime;		/* Recently used cputime				*/
	ULONG	recent_used_cputime_hz;		/* 100 * recent / hz = RECENT CPU %		*/
	UWORD	recent_seconds;				/* "recent" means this many seconds		*/

	ULONG	involuntary_csw;			/* Involuntary context switches 		*/
	ULONG	voluntary_csw;				/* Voluntary context switches			*/
	ULONG	total_csw;					/* Total # of context switches			*/

	ULONG	involuntary_csw_lastsec;	/* Involuntary csws during last second	*/
	ULONG	voluntary_csw_lastsec;		/* Voluntary csws during last second	*/
	ULONG	total_csw_lastsec;			/* Total # of csws during last second	*/

	LONG	reserved[8];				/* Reserved for future use				*/
};

/* These bits are used in cpu_usage_implemented-field */
#define TASK_CPU_USAGEB_TOTAL_IMPLEMENTED				0
#define TASK_CPU_USAGEB_LASTSEC_IMPLEMENTED				1
#define TASK_CPU_USAGEB_RECENT_IMPLEMENTED				2
#define TASK_CPU_USAGEB_IVVOCSW_IMPLEMENTED				3
#define TASK_CPU_USAGEB_TOTALCSW_IMPLEMENTED			4
#define TASK_CPU_USAGEB_IVVOCSW_LASTSEC_IMPLEMENTED		5
#define TASK_CPU_USAGEB_TOTALCSW_LASTSEC_IMPLEMENTED	6

#define TASK_CPU_USAGEF_TOTAL_IMPLEMENTED				(1L<<0)
#define TASK_CPU_USAGEF_LASTSEC_IMPLEMENTED				(1L<<1)
#define TASK_CPU_USAGEF_RECENT_IMPLEMENTED				(1L<<2)
#define TASK_CPU_USAGEF_IVVOCSW_IMPLEMENTED				(1L<<3)
#define TASK_CPU_USAGEF_TOTALCSW_IMPLEMENTED			(1L<<4)
#define TASK_CPU_USAGEF_IVVOCSW_LASTSEC_IMPLEMENTED		(1L<<5)
#define TASK_CPU_USAGEF_TOTALCSW_LASTSEC_IMPLEMENTED	(1L<<6)

#endif /* LIBRARIES_SYSINFO_H */
