Provided by: pcp_3.5.11_amd64 bug

NAME

       pmafm,  pmRecordSetup,  pmRecordAddHost,  pmRecordControl  - record mode support for PMAPI
       clients

C SYNOPSIS

       #include <pcp/pmafm.h>

       FILE *pmRecordSetup(const char *folio, const char *creator, int replay);
       int pmRecordAddHost(const char *host, int isdefault, pmRecordHost **rhp);
       int pmRecordControl(pmRecordHost *rhp, int request, const char *options);

       cc ... -lpcp_gui

DESCRIPTION

       These routines may be used to create a Performance Co-Pilot (PCP) archive ``on  the  fly''
       to support ``record mode'' services for PMAPI client applications.

       Each  record  mode  ``session'' involves one or more PCP archive logs each created using a
       dedicated pmlogger(1) process, with an overall  Archive  Folio  format  as  understood  by
       pmafm(1),  to  name and collect all of the archive logs associated with a single recording
       session.

       The pmRecordHost structure is used to maintain state information between  the  creator  of
       the  recording  session and the associated pmlogger process(es).  The structure is defined
       as:
         typedef struct {
             FILE   *f_config;    /* caller writes pmlogger configuration here */
             int    fd_ipc;       /* IPC channel to pmlogger */
             char   *logfile;     /* full pathname for pmlogger error logfile */
             pid_t  pid;          /* process id for pmlogger */
             int    status;       /* exit status, -1 if unknown */
         } pmRecordHost;

       The routines are used in combination to create a recording session as follows.

       1.  Call pmRecordSetup to establish a new recording session.  A new Archive Folio will  be
           created  using  the  name folio; if the file or directory folio already exists, or the
           file folio cannot be created, this is an error.  The application that is creating  the
           session  is  identified  by  creator  (most often this would be the same as the global
           PMAPI application name, pmProgname).  If the application knows how to create  its  own
           configuration file to replay the recorded session, then replay should be non-zero.

           pmRecordSetup  returns a stdio stream onto which the application should write the text
           of the required replay configuration file, if any.

       2.  For each host that is to be included in the recording session,  call  pmRecordAddHost.
           A  new  pmRecordHost  structure  is  returned  via rhp.  It is assumed that pmcd(1) is
           running on host as this is how pmlogger(1)  will  retrieve  the  required  performance
           metrics.

           If  this host is the default host for this recording session, then isdefault should be
           non-zero.  This will ensure that the corresponding archive appears first  in  the  PCP
           archive  folio,  and  hence  the  tools used to replay the archive folio will make the
           correct determination of the archive associated with the default host.   At  most  one
           host per recording session may be nominated as the default host.

           The calling application should write the desired pmlogger configuration onto the stdio
           stream returned via the f_config field in the pmRecordHost structure.

       3.  Optionally add arguments to the command line that will be used to  launch  pmlogger(1)
           by  calling  pmRecordControl  with a request of PM_REC_SETARG.  The argument is passed
           via options and one call to pmRecordControl is required for each distinct argument.

           An argument may be added for a particular pmlogger instance identified by rhp,  or  if
           the rhp argument is NULL the argument is added for all pmlogger instances that will be
           launched in the current recording session.

           Independent of any calls to pmRecordControl with  a  request  of  PM_REC_SETARG,  each
           pmlogger instance will automatically be launched with the following arguments: -c, -h,
           -l, -x and the basename for the PCP archive log.

       4.  To commence the recording session, call pmRecordControl with a request  of  PM_REC_ON,
           and  rhp  must be NULL.  This will launch one pmlogger(1) process for each host in the
           recording session, and initialize the fd_ipc, logfile, pid and status  fields  in  the
           associated pmRecordHost structure(s).

       5.  To  terminate  a  pmlogger  instance  identified  by  rhp, call pmRecordControl with a
           request  of  PM_REC_OFF.   If  the  rhp  argument  to  pmRecordControl  is  NULL,  the
           termination  request  is  broadcast to all pmlogger processes in the current recording
           session.

           An informative dialog is generated directly by each pmlogger process  and  hence  note
           the comments on the disposition of output from pmlogger below.

       6.  To  display  the  current  status  of  the  pmlogger  instance identified by rhp, call
           pmRecordControl  with  a  request  of  PM_REC_STATUS.   If   the   rhp   argument   to
           pmRecordControl  is NULL, the status request is broadcast to all pmlogger processes in
           the current recording session.

           The display is generated directly by each pmlogger process and hence note the comments
           on the disposition of output from pmlogger below.

       7.  To  detach  a pmlogger instance identified by rhp and allow it to continue independent
           of the application that launched the recording session, call  pmRecordControl  with  a
           request  of PM_REC_DETACH.  If the rhp argument to pmRecordControl is NULL, the detach
           request is broadcast to all pmlogger processes in the current recording session.

           An informative dialog is generated directly by each pmlogger process  and  hence  note
           the comments on the disposition of output from pmlogger below.

       The  calling  application should not close any of the returned stdio streams; this will be
       done by pmRecordControl when recording is commenced.

       Once pmlogger has been  started  for  a  recording  session,  then  pmlogger  will  assume
       responsibility  for  any  dialog  with  the  user  in  the event that the application that
       launched the recording session should exit, particularly without terminating the recording
       session.

       By  default,  information  and dialogs from pmlogger will be displayed using pmquery(1) on
       the assumption that most applications wishing to launch a recording session are GUI-based.
       In  the  event  that  pmquery  fails  to display the information (for example, because the
       DISPLAY environment variable is not set), pmlogger will write on  its  own  stderr  stream
       (not  the  stderr  stream  of  the  launching process); the output will be assigned to the
       XXXXXX.host.log file described in the FILES section  below.   For  convenience,  the  full
       pathname to this file is provided via the logfile field in the pmRecordHost structure.

       If  the  options  argument to pmRecordControl is not NULL, this string may be used to pass
       additional arguments to pmquery(1) in those cases where a dialog is to be displayed.   One
       use  of this capability would be to provide a -geometry string to control the placement of
       the dialog.

       Premature termination  of  a  launched  pmlogger  process  may  be  determined  using  the
       pmRecordHost  structure,  by  calling  select(2) on the fd_ipc field or polling the status
       field that will contain the termination status from waitpid(2) if known, else -1.

SEE ALSO

       pmafm(1), pmlogger(1), pmquery(1) and PMAPI(3).

FILES

       These routines create a number of files in the same directory as the folio file  named  in
       the  call  to  pmRecordSetup.   In  all  cases,  the ``XXXXXX'' component is the result of
       calling mktemp(3).

       XXXXXX    If replay is non-zero, this is the creator's replay configuration file, else  an
                 empty control file, used to guarantee uniqueness.
       folio     The PCP Archive Folio, suitable for use with pmafm(1).
       XXXXXX.host.config
                 The  pmlogger(1)  configuration  for  each  host  -  if the same host is used in
                 different calls to pmRecordAddHost within the same recording session then one of
                 the  letters  ``a'' through ``z'' will be appended to the ``XXXXXX'' part of all
                 associated file names to ensure uniqueness.
       XXXXXX.host.log
                 stdout and stderr for the pmlogger(1) instance for each host.
       XXXXXX.host.{0,meta,index}
                 The files comprising a single PCP archive for each host.

DIAGNOSTICS

       pmRecordSetup may return NULL in the event of an error.  Check errno for the  real  cause,
       but  the  value  EINVAL  typically  means that the order of calls to these routines is not
       correct (there is obvious state associated with the  current  recording  session  that  is
       maintained across calls to these routines).  For example the following calls would produce
       this EINVAL error; calling pmRecordControl before calling pmRecordAddHost at  least  once,
       or calling pmRecordAddHost before calling pmRecordSetup.

       pmRecordControl  and  pmRecordAddHost  both  return 0 on success, else a value less than 0
       suitable for decoding with pmErrStr(3)  on  failure.   The  value  -EINVAL  has  the  same
       interpretation as errno being set to EINVAL as described above.

       pmRecordControl  will  return  PM_ERR_IPC  if  the associated pmlogger process has already
       exited.