OZ++ Class: SystemInformation
/******************************************************************************
 *
 * Copyright (c) 2016 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer.
 *
 * 2. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 *  SystemInformation.h
 *
 *****************************************************************************/

#pragma once

#include <oz++/CommonObject.h>
#include <oz++/Exception.h>

#include <sys/sysinfo.h>


/*
On Linux 2.3.23 (i386)、2.3.48 
struct sysinfo {
  long uptime;                // Seconds since boot 
  unsigned long loads[3];    // 1, 5, and 15 minute load averages 
  unsigned long totalram;    // Total usable main memory size
  unsigned long freeram;    // Available memory size 
  unsigned long sharedram;      // Amount of shared memory 
  unsigned long bufferram;      // Memory used by buffers 
  unsigned long totalswap;      // Total swap space size 
  unsigned long freeswap;    // swap space still available 
  unsigned short procs;            // Number of current processes 
  unsigned long totalhigh;      // Total high memory size 
  unsigned long freehigh;    // Available high memory size
  unsigned int mem_unit;    // Memory unit size in bytes 
  char _f[20-2*sizeof(long)-sizeof(int)]; // Padding for libc5 
 };

 */

namespace OZ {

class SystemInformation :public CommonObject {
private:
  struct sysinfo info;

public:
  SystemInformation()
  {
    memset(&info, 0, sizeof(info));
    int rc = sysinfo(&info);
    if (rc != 0) {
      throw IException("Failed to sysinfo");
    }
  }

  long upTime()
  {
    return info.uptime;                  // Seconds since boot
  } 
  
  unsigned long loadAverage1Minute()
  {
    return info.loads[0];       // 1, 5, and 15 minute load averages
  }

  unsigned long loadAverage5Minute()
  {
    return info.loads[1];       // 1, 5, and 15 minute load averages
  }

  unsigned long loadAverage15Minute()
  {
    return info.loads[2];       // 1, 5, and 15 minute load averages
  }
  unsigned long totalRam()
  {
    return info.totalram;       // Total usable main memory size
  }

  unsigned long freeRam()
  {
    return info.freeram;        // Available memory size
  }

  unsigned long sharedRam()
  {
    return info.sharedram;      // Amount of shared memory
  }

  unsigned long bufferRam()
  {
    return info.bufferram;      // Memory used by buffers
  }

  unsigned long totalSwap()
  {
    return info.totalswap;      // Total swap space size
  }

  unsigned long freeSwap()
  {
    return info.freeswap;       // swap space still available
  }

  unsigned short numberOfProcesses()
  {
    return info.procs;         // Number of current processes
  }

  unsigned long totalHighMemory()
  {
    return info.totalhigh;      // Total high memory size
  }

  unsigned long freeHighMemory()
  {
    return info.freehigh;       // Available high memory size
  }

  unsigned int memoryUnit()
  {
     return info.mem_unit;        // Memory unit size in bytes
  }

  virtual void display()
  {
    printf("UpTime              %lu\n", upTime());
    printf("LoadAverage1Minute  %lu\n", loadAverage1Minute());
    printf("LoadAverage5Minute  %lu\n", loadAverage5Minute());
    printf("LoadAverage15Minute %lu\n", loadAverage15Minute());
    printf("TotalRam            %lu\n", totalRam());
    printf("FreeRam             %lu\n",  freeRam());
    printf("SharedRam           %lu\n",  sharedRam());
    printf("BufferRam           %lu\n",  bufferRam());
    printf("TotalSwap           %lu\n", totalSwap());
    printf("FreeSwap            %lu\n", freeSwap());
    printf("NumberOfProcesses   %u\n", numberOfProcesses());
    printf("TotalHighMemory     %lu\n", totalHighMemory());
    printf("FreeHighMemory      %lu\n", freeHighMemory());
    printf("MemoryUnit          %du\n",  memoryUnit());
  }
};

}