blob: 0471f3c6dcdddb41e70be1b30c6eb491fd2f4dd3 [file] [log] [blame]
/*=========================================================================
* Copyright (c) 2004-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* more patents listed at http://www.pivotal.io/patents.
*=========================================================================
*/
#include "../gfcpp_globals.hpp"
#include <ace/OS_NS_sys_utsname.h>
#include "HostStatHelper.hpp"
#include "GemfireStatisticsFactory.hpp"
using namespace gemfire_statistics;
/**
* Provides native methods which fetch operating system statistics.
* accessed by calling {@link #getInstance()}.
*
*/
int32 HostStatHelper:: PROCESS_STAT_FLAG = 1;
int32 HostStatHelper::SYSTEM_STAT_FLAG = 2;
GFS_OSTYPES HostStatHelper::osCode = (GFS_OSTYPES)0;//Default OS is Linux
ProcessStats* HostStatHelper::processStats = NULL;
/**
* Determine the OS and creates Process Statistics Type for that OS
*/
void HostStatHelper::initOSCode()
{
ACE_utsname u;
ACE_OS::uname(&u);
std::string osName(u.sysname);
if (osName =="Linux")
{
osCode = GFS_OSTYPE_LINUX;
}
else if ((osName =="Windows") || (osName == "Win32"))
{
osCode = GFS_OSTYPE_WINDOWS;
}
else if (osName =="SunOS")
{
osCode = GFS_OSTYPE_SOLARIS;
}
else if (osName =="Darwin")
{
osCode = GFS_OSTYPE_MACOSX;
}
else
{
char buf[1024] = {0};
ACE_OS::snprintf( buf, 1024, "HostStatHelper::initOSTypes:unhandled os type: %s", osName.c_str() );
throw IllegalArgumentException( buf );
}
}
/**
* Refresh statistics of the process through operating system specific calls
*/
void HostStatHelper::refresh()
{
if(processStats != NULL) {
#if defined(_WIN32)
HostStatHelperWin::refreshProcess(processStats);
#elif defined(_SOLARIS)
HostStatHelperSolaris::refreshProcess(processStats);
#elif defined(_LINUX)
HostStatHelperLinux::refreshProcess(processStats);
#elif defined(_MACOSX)
HostStatHelperNull::refreshProcess(processStats);
#else
#error missing stats helper
#endif
}
}
/**
* Creates and returns a {@link Statistics} with
* the given pid and name.
*/
void HostStatHelper::newProcessStats(int64 pid, const char* name)
{
// Init OsCode
initOSCode();
// Create processStats , Internally they will create own stats
switch (osCode)
{
case GFS_OSTYPE_SOLARIS:
processStats = new SolarisProcessStats(pid,name);
break;
case GFS_OSTYPE_LINUX:
processStats = new LinuxProcessStats(pid,name);
break;
case GFS_OSTYPE_WINDOWS:
processStats = new WindowsProcessStats(pid,name);
break;
case GFS_OSTYPE_MACOSX:
processStats = new NullProcessStats(pid,name);
break;
default:
throw IllegalArgumentException
("HostStatHelper::newProcess:unhandled osCodem");
}
GF_D_ASSERT(processStats != NULL);
}
void HostStatHelper::close()
{
if(processStats)
{
processStats->close();
}
}
void HostStatHelper::cleanup()
{
#if defined(_WIN32)
HostStatHelperWin::closeHostStatHelperWin();//close registry structures
#endif
#if defined(_SOLARIS)
HostStatHelperSolaris::closeHostStatHelperSolaris();//close kstats
#endif
if(processStats)
{
delete processStats;
processStats = NULL;
}
}
int32 HostStatHelper::getCpuUsage( )
{
if ( HostStatHelper::processStats != NULL ) {
return HostStatHelper::processStats->getCpuUsage();
}
return 0;
}
int64 HostStatHelper::getCpuTime( )
{
if( HostStatHelper::processStats != NULL){
return HostStatHelper::processStats->getAllCpuTime();
}
return 0;
}
int32 HostStatHelper::getNumThreads( )
{
if ( HostStatHelper::processStats != NULL ) {
return HostStatHelper::processStats->getNumThreads();
}
return 0;
}