/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* bos72Q src/bos/usr/include/trace.h 1.1.1.1                             */
/*                                                                        */
/* Licensed Materials - Property of IBM                                   */
/*                                                                        */
/* Restricted Materials of IBM                                            */
/*                                                                        */
/* COPYRIGHT International Business Machines Corp. 2006,2019              */
/* All Rights Reserved                                                    */
/*                                                                        */
/* US Government Users Restricted Rights - Use, duplication or            */
/* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.      */
/*                                                                        */
/* IBM_PROLOG_END_TAG                                                     */
/* @(#)02     1.1.1.1  src/bos/usr/include/trace.h, posixtrace, bos72Q, q2019_13A4 2/5/19 03:07:14 */

#ifndef _H_TRACE  
#define _H_TRACE  

#include <sys/types.h>
#include <sys/limits.h>
#include <time.h>


#ifdef __cplusplus
extern "C" {
#endif

/*
 * overflow policy
 */
#define POSIX_TRACE_LOOP		0
#define POSIX_TRACE_UNTIL_FULL		1
#define POSIX_TRACE_FLUSH		2
#define POSIX_TRACE_APPEND		3
/* 
 * inheritance
 */
#define  POSIX_TRACE_CLOSE_FOR_CHILD	0
#define  POSIX_TRACE_INHERITED		1

/*
 * reserved event IDs
 */
#define  POSIX_TRACE_OVERFLOW		0
#define  POSIX_TRACE_RESUME       	1
#define  POSIX_TRACE_START        	2
#define  POSIX_TRACE_STOP         	3
#define  POSIX_TRACE_FLUSH_START        4
#define  POSIX_TRACE_FLUSH_STOP      	5
#define  POSIX_TRACE_FILTER		6
#define  POSIX_TRACE_ERROR		7
#define  POSIX_TRACE_UNNAMED_USEREVENT  8

/* event set ops */
#define POSIX_TRACE_SET_EVENTSET 0
#define POSIX_TRACE_ADD_EVENTSET 1
#define POSIX_TRACE_SUB_EVENTSET 2

/* event sets */
#define POSIX_TRACE_SYSTEM_EVENTS	0
#define POSIX_TRACE_WOPID_EVENTS	1
#define POSIX_TRACE_ALL_EVENTS		2

struct posix_trace_event_info {
	trace_event_id_t posix_event_id;	/* event ID */
	pid_t		 posix_pid;		/* pid that generated the evt */
	void		*posix_prog_address;
#define  POSIX_TRACE_NOT_TRUNCATED     0
#define  POSIX_TRACE_TRUNCATED_RECORD  1
#define  POSIX_TRACE_TRUNCATED_READ    2
	int		 posix_truncation_status;
	struct timespec	 posix_timestamp;
	pthread_t	 posix_thread_id;
};

struct posix_trace_status_info {
#define POSIX_TRACE_RUNNING	1
#define POSIX_TRACE_SUSPENDED	0
	int posix_stream_status;
#define POSIX_TRACE_FULL	1
#define POSIX_TRACE_NOT_FULL	0
	int posix_stream_full_status;
#define POSIX_TRACE_OVERRUN	1
#define POSIX_TRACE_NO_OVERRUN	0
	int posix_stream_overrun_status;
	/* Trace Log option */ 
#define POSIX_TRACE_FLUSHING     1
#define POSIX_TRACE_NOT_FLUSHING 0
	int posix_stream_flush_status;   /* POSIX_TRACE_FLUSHING 
					    or POSIX_TRACE_NOT_FLUSHING */ 
	int posix_stream_flush_error;    /* 0 or value of the first error 
					    that occurred */ 
	int posix_log_overrun_status;    /* POSIX_TRACE_OVERRUN 
					    or POSIX_TRACE_NO_OVERRUN */ 
	int posix_log_full_status;       /* POSIX_TRACE_FULL 
				    	    or POSIX_TRACE_NOT_FULL */
};


extern int posix_trace_attr_init(trace_attr_t *);
extern int posix_trace_attr_destroy(trace_attr_t *);
extern int posix_trace_attr_setinherited(trace_attr_t *, int);
extern int posix_trace_attr_getinherited(const trace_attr_t *__restrict__, 
    int *);
extern int posix_trace_attr_setstreamsize(trace_attr_t *, size_t);
extern int posix_trace_attr_getstreamsize(const trace_attr_t *__restrict__,
    size_t *__restrict__);
extern int posix_trace_attr_setlogsize(trace_attr_t *, size_t);
extern int posix_trace_attr_getlogsize(const trace_attr_t *__restrict__,
    size_t *__restrict__);
extern int posix_trace_attr_setmaxdatasize(trace_attr_t *, size_t);
extern int posix_trace_attr_getmaxdatasize(const trace_attr_t *__restrict__,
    size_t *__restrict__);
extern int posix_trace_attr_setstreamfullpolicy(trace_attr_t *, int);
extern int posix_trace_attr_getstreamfullpolicy(
    const trace_attr_t *__restrict__, int *);
extern int posix_trace_attr_setlogfullpolicy(trace_attr_t *, int);
extern int posix_trace_attr_getlogfullpolicy(
    const trace_attr_t *__restrict__, int *__restrict__);
extern int posix_trace_create(pid_t pid, const trace_attr_t *__restrict__, 
    trace_id_t *__restrict__);
extern int posix_trace_create_withlog(pid_t pid, 
    const trace_attr_t *__restrict__,int, trace_id_t *__restrict__);
extern int posix_trace_shutdown(trace_id_t);
extern int posix_trace_flush(trace_id_t);
extern int posix_trace_eventid_open(const char *, 
    trace_event_id_t *__restrict__);
extern int posix_trace_start(trace_id_t);
extern int posix_trace_stop(trace_id_t);
extern void posix_trace_event(trace_event_id_t, const void *__restrict__, 
    size_t);
extern int posix_trace_getnext_event(trace_id_t, 
    struct posix_trace_event_info *__restrict__, void *__restrict__, 
    size_t, size_t *__restrict__, int *__restrict__);
extern int posix_trace_trygetnext_event(trace_id_t, 
    struct posix_trace_event_info *__restrict__, void *__restrict__, 
    size_t, size_t *__restrict__, int *__restrict__);
extern int posix_trace_timedgetnext_event(trace_id_t, 
    struct posix_trace_event_info *__restrict__, void *__restrict__, 
    size_t, size_t *__restrict__, int *__restrict__,
    const struct timespec *__restrict__);
extern int posix_trace_attr_getname(const trace_attr_t *, char *);
extern int posix_trace_attr_setname(trace_attr_t *, const char *);
extern int posix_trace_attr_getclockres(const trace_attr_t *, 
    struct timespec *);
extern int posix_trace_attr_getcreatetime(const trace_attr_t *, 
    struct timespec *);
extern int posix_trace_attr_getgenversion(const trace_attr_t *, char *);
extern int posix_trace_attr_getmaxsystemeventsize(
    const trace_attr_t *__restrict__, size_t *__restrict__);
extern int posix_trace_attr_getmaxusereventsize(
    const trace_attr_t *__restrict__, size_t, size_t *__restrict__);
extern int posix_trace_get_attr(trace_id_t strid, trace_attr_t *addr);
extern int posix_trace_get_status(trace_id_t,
    struct posix_trace_status_info *);
extern int posix_trace_get_filter(trace_id_t, trace_event_set_t *);
extern int posix_trace_set_filter(trace_id_t, const trace_event_set_t *, int);

extern int posix_trace_eventset_add(trace_event_id_t, trace_event_set_t *);
extern int posix_trace_eventset_del(trace_event_id_t, trace_event_set_t *);
extern int posix_trace_eventset_empty(trace_event_set_t *);
extern int posix_trace_eventset_fill(trace_event_set_t *, int);
extern int posix_trace_eventset_ismember(trace_event_id_t,
    const trace_event_set_t *__restrict__, int *__restrict__);
extern int posix_trace_eventid_get_name(trace_id_t, trace_event_id_t, 
    char *);
extern int posix_trace_eventid_equal(trace_id_t, trace_event_id_t, 
    trace_event_id_t);
extern int posix_trace_eventtypelist_getnext_id(trace_id_t, 
    trace_event_id_t *__restrict__, int *__restrict__);
extern int posix_trace_eventtypelist_rewind(trace_id_t);
extern int posix_trace_trid_eventid_open(trace_id_t, const char *__restrict__,
    trace_event_id_t *__restrict__);
extern int posix_trace_clear(trace_id_t);
extern int posix_trace_close(trace_id_t);
extern int posix_trace_open(int, trace_id_t *);
extern int posix_trace_rewind(trace_id_t);

#ifdef __cplusplus
}
#endif

#endif /* _H_TRACE  */