VMS-Monitor

 view release on metacpan or  search on metacpan

Monitor.xs  view on Meta::CPAN

   starting at the beginning of the buffer we pass, it returns it starting
   in by 4 bytes. Go figure.

   */
#ifdef __cplusplus
extern "C" {
#endif
#include <starlet.h>
#include <descrip.h>
#include <prvdef.h>
#include <jpidef.h>
#include <uaidef.h>
#include <ssdef.h>
#include <stsdef.h>
#include <prcdef.h>
#include <pcbdef.h>
#include <pscandef.h>
#include <lib$routines.h>

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#ifdef __cplusplus
}
#endif

#pragma nomember_alignment
struct scs_info {
  int scs_nodename[2];
  int scs_dgsent;
  int scs_dgrcvd;
  int scs_dgdiscard;
  int scs_msgsent;
  int scs_msgrcvd;
  int scs_snddats;
  int scs_kbytsent;
  int scs_reqdats;
  int scs_kbytreqd;
  int scs_kbytmapd;
  int scs_qcr_cnt;
  int scs_qbdt_cnt;
} ;

struct disk_info {
  char disk_alloclass;
  int disk_devname[1];
  short int disk_unitnum;
  char disk_flags;
  int disk_nodename[2];
  int disk_volname[3];
  int disk_optcnt;
  int disk_qcount;
};

struct proc_info {
  int proc_ipid;
  int proc_uic;
  short int proc_state;
  char proc_pri;
  int proc_lname[4];
  int proc_gpgcnt;
  int proc_ppgcnt;
  int proc_sts;
  int proc_diocnt;
  int proc_pageflts;
  int proc_cputim;
  int proc_biocnt;
  int proc_epid;
  int proc_efwm;
  int proc_rbstran;
};

struct mode_info {
  char cpu_id;
  int interrupt_time;
  int mpsync_time;
  int kernel_time;
  int exec_time;
  int super_time;
  int user_time;
  int compatibility_time;
  int idle_time;
};
#pragma member_alignment

typedef union {
  struct {short   buflen,          /* Length of output buffer */
                  itmcode;         /* Item code */
          void    *buffer;         /* Buffer address */
          long    itemflags;       /* Item flags */
        } BufferItem;  /* Layout of buffer $PROCESS_SCAN item-list elements */
                
  struct {short   buflen,          /* Length of output buffer */
                  itmcode;         /* Item code */
          long    itemvalue;       /* Value for this item */ 
          long    itemflags;       /* flags for this item */
        } LiteralItem;  /* Layout of literal $PROCESS_SCAN item-list */
                        /* elements */
  struct {short   buflen,          /* Length of output buffer */
                  itmcode;         /* Item code */
          void    *buffer;         /* Buffer address */
          void    *retlen;         /* Return length address */
        } TradItem;  /* Layout of 'traditional' item-list elements */
} ITMLST;

typedef struct {int sts;     /* Returned status */
                int unused;  /* Unused by us */
              } iosb;

/* Prototype for exe$getspi. Takes an event flag pointer, a CSID pointer
   (unused), a pointer to a string descriptor with the nodename (unused), a
   pointer to an itemlist, a pointer to an IOSB structure, a pointer to an
   AST completion routine, and a pointer to an AST routine parameter.

   This info snagged from the SYSGETSPI.MAR module off the VMS listing CD.
*/
short exe$getspi(int, void *, void *, void *, void *, void *, long *);

typedef struct {char  *ItemName;         /* Name of the item we're getting */
                unsigned short *ReturnLength; /* Pointer to the return */
                                              /* buffer length */

Monitor.xs  view on Meta::CPAN

            hv_store(TempHV, "VOLNAME", 7,
                     newSVpv(&TempName[0], 12), 0);

            memcpy(TempName, ReturnDiskInfo[i].disk_devname, 4);
            hv_store(TempHV, "DEVNAME", 7,
                     newSVpv(&TempName[1], TempName[0]), 0);

            hv_store(TempHV, "ALLOCLASS", 8,
                     newSViv(ReturnDiskInfo[i].disk_alloclass), 0);
            hv_store(TempHV, "FLAGS", 5,
                     newSViv(ReturnDiskInfo[i].disk_flags), 0);
            hv_store(TempHV, "OPTCNT", 6,
                     newSViv(ReturnDiskInfo[i].disk_optcnt), 0);
            hv_store(TempHV, "QCOUNT", 6,
                     newSViv(ReturnDiskInfo[i].disk_qcount), 0);
            hv_store(TempHV, "UNITNUM", 7,
                     newSViv(ReturnDiskInfo[i].disk_unitnum), 0);
            
          }
          /* Return a reference to our array */
          ST(0) = newRV_noinc((SV *)TempAV);
        }

        /* Give back the buffer */
        free(ReturnStringBuffer);
        break;
      case IS_PROCESS:
        {
          int i = 0;
          AV *TempAV;
          HV *TempHV;
          char TempName[20];
          TempAV = newAV();
          sv_2mortal((SV *)TempAV);
          /* Swap to a pointer variable of the type we like */
          ReturnProcInfo = (void *)ReturnStringBuffer;
          /* Add four bytes because GETSPI doesn't return starting at the */
          /* beginning of the buffer. Dunno why. */
          ReturnProcInfo = (void *)((char *)ReturnProcInfo + 4);
          
          for (i=0; (i<NUM_PROCESS) && ReturnProcInfo[i].proc_ipid; i++) {
            /* Get a new hash */
            TempHV = newHV();
            /* Push a reference to it on our array */
            av_push(TempAV, newRV_noinc((SV *)TempHV));
            /* Fill it in */
            hv_store(TempHV, "IPID", 4,
                     newSViv(ReturnProcInfo[i].proc_ipid), 0);
            hv_store(TempHV, "UIC", 3,
                     newSViv(ReturnProcInfo[i].proc_uic), 0);
            hv_store(TempHV, "STATE", 5,
                     newSViv(ReturnProcInfo[i].proc_state), 0);
            hv_store(TempHV, "PRI", 3,
                     newSViv(ReturnProcInfo[i].proc_pri), 0);

            memcpy(TempName, ReturnProcInfo[i].proc_lname, 16);
            hv_store(TempHV, "NAME", 4,
                     newSVpv(&TempName[1], TempName[0]), 0);

            hv_store(TempHV, "GPGCNT", 6,
                     newSViv(ReturnProcInfo[i].proc_gpgcnt), 0);
            hv_store(TempHV, "PPGCNT", 6,
                     newSViv(ReturnProcInfo[i].proc_ppgcnt), 0);
            hv_store(TempHV, "STS", 3,
                     newSViv(ReturnProcInfo[i].proc_sts), 0);
            hv_store(TempHV, "DIOCNT", 6,
                     newSViv(ReturnProcInfo[i].proc_diocnt), 0);
            hv_store(TempHV, "PAGEFLTS", 8,
                     newSViv(ReturnProcInfo[i].proc_pageflts), 0);
            hv_store(TempHV, "CPUTIM", 6,
                     newSViv(ReturnProcInfo[i].proc_cputim), 0);
            hv_store(TempHV, "BIOCNT", 6,
                     newSViv(ReturnProcInfo[i].proc_biocnt), 0);
            hv_store(TempHV, "EPID", 4,
                     newSViv(ReturnProcInfo[i].proc_epid), 0);
            hv_store(TempHV, "EFWM", 4,
                     newSViv(ReturnProcInfo[i].proc_efwm), 0);
            hv_store(TempHV, "RBSTRAN", 9,
                     newSViv(ReturnProcInfo[i].proc_rbstran), 0);
            
            
          }
          /* Return a reference to our array */
          ST(0) = newRV_noinc((SV *)TempAV);
        }

        /* Give back the buffer */
        free(ReturnStringBuffer);
        break;
      default:
        ST(0) = &PL_sv_undef;
        break;
      }
    } else {
      SETERRNO(EVMSERR, status);
      ST(0) = &PL_sv_undef;
      /* free up the buffer if we were looking for a string */
      if (MonitorInfoList[i].ReturnType == IS_STRING)
        free(ReturnStringBuffer);
    }
  }
}



( run in 1.033 second using v1.01-cache-2.11-cpan-df04353d9ac )