use timeval instead of second

pull/6/head
yuqing 2016-01-29 14:40:34 +08:00
parent 0165a3357b
commit 7b9b40d2f5
3 changed files with 76 additions and 45 deletions

View File

@ -84,37 +84,65 @@ int get_sys_cpu_count()
#endif
}
int get_uptime(time_t *uptime)
#define TIMEVAL_TO_SECONDS(tv) \
((double)tv.tv_sec + (double)tv.tv_usec / 1000000.00)
#define SECONDS_TO_TIMEVAL(secs, tv) \
do { \
(tv).tv_sec = (time_t)secs; \
(tv).tv_usec = (secs - (tv).tv_sec) * 1000000; \
} while (0)
int get_boot_time(struct timeval *boot_time)
{
#ifdef OS_LINUX
char buff[256];
int64_t bytes;
struct sysinfo si;
bytes = sizeof(buff);
if (getFileContentEx("/proc/uptime", buff, 0, &bytes) == 0)
{
double uptime;
double btime;
struct timeval current_time;
if (sscanf(buff, "%lf", &uptime) == 1)
{
gettimeofday(&current_time, NULL);
btime = TIMEVAL_TO_SECONDS(current_time) - uptime;
SECONDS_TO_TIMEVAL(btime, *boot_time);
return 0;
}
}
if (sysinfo(&si) != 0)
{
logError("file: "__FILE__", line: %d, "
"call sysinfo fail, "
"errno: %d, error info: %s",
__LINE__, errno, STRERROR(errno));
return errno != 0 ? errno : EPERM;
logError("file: "__FILE__", line: %d, "
"call sysinfo fail, "
"errno: %d, error info: %s",
__LINE__, errno, STRERROR(errno));
return errno != 0 ? errno : EPERM;
}
*uptime = si.uptime;
boot_time->tv_sec = time(NULL) - si.uptime;
boot_time->tv_usec = 0;
return 0;
#elif defined(OS_FREEBSD)
struct timeval boottime;
size_t size;
int mib[2];
mib[0] = CTL_KERN;
mib[1] = KERN_BOOTTIME;
size = sizeof(boottime);
if (sysctl(mib, 2, &boottime, &size, NULL, 0) == 0 &&
boottime.tv_sec != 0)
size = sizeof(struct timeval);
if (sysctl(mib, 2, boot_time, &size, NULL, 0) == 0)
{
*uptime = time(NULL) - boottime.tv_sec;
return 0;
}
else
{
*uptime = 0;
boot_time->tv_sec = 0;
boot_time->tv_usec = 0;
logError("file: "__FILE__", line: %d, "
"call sysctl fail, "
"errno: %d, error info: %s",
@ -122,7 +150,8 @@ int get_uptime(time_t *uptime)
return errno != 0 ? errno : EPERM;
}
#else
*uptime = 0;
boot_time->tv_sec = 0;
boot_time->tv_usec = 0;
logError("file: "__FILE__", line: %d, "
"please port me!", __LINE__);
return EOPNOTSUPP;
@ -309,7 +338,8 @@ static int check_process_capacity(FastProcessArray *proc_array)
return 0;
}
static void parse_proc_stat(char *buff, const int len, struct fast_process_info *process)
static void parse_proc_stat(char *buff, const int len,
struct fast_process_info *process, unsigned long long *starttime)
{
char *p;
char *end;
@ -391,7 +421,7 @@ static void parse_proc_stat(char *buff, const int len, struct fast_process_info
&process->nice,
&process->num_threads,
&process->itrealvalue,
&process->starttime,
starttime,
&process->vsize,
&process->rss,
&process->rsslim,
@ -422,24 +452,16 @@ int get_processes(struct fast_process_info **processes, int *count)
char filename[128];
char buff[4096];
DIR *dir;
struct sysinfo info;
struct timeval boot_time;
struct dirent *ent;
FastProcessArray proc_array;
int64_t bytes;
unsigned long long starttime;
int tickets;
int result;
int len;
int i;
if (sysinfo(&info) == 0)
{
info.uptime = time(NULL) - info.uptime;
}
else
{
info.uptime = 0;
}
tickets = sysconf(_SC_CLK_TCK);
if (tickets == 0)
{
@ -477,6 +499,11 @@ int get_processes(struct fast_process_info **processes, int *count)
continue;
}
if ((result=check_process_capacity(&proc_array)) != 0)
{
break;
}
sprintf(filename, "%s/%s/stat", dirname, ent->d_name);
bytes = sizeof(buff);
if (getFileContentEx(filename, buff, 0, &bytes) != 0)
@ -484,15 +511,15 @@ int get_processes(struct fast_process_info **processes, int *count)
continue;
}
if ((result=check_process_capacity(&proc_array)) != 0)
{
break;
}
get_boot_time(&boot_time);
parse_proc_stat(buff, bytes, proc_array.procs + proc_array.count,
&starttime);
SECONDS_TO_TIMEVAL(TIMEVAL_TO_SECONDS(boot_time) +
(double)starttime / (double)tickets,
proc_array.procs[proc_array.count].starttime);
parse_proc_stat(buff, bytes, proc_array.procs + proc_array.count);
proc_array.procs[proc_array.count].starttime =
info.uptime + proc_array.procs[proc_array.count].
starttime / tickets;
proc_array.count++;
}
closedir(dir);
@ -505,6 +532,8 @@ int get_processes(struct fast_process_info **processes, int *count)
int get_sysinfo(struct fast_sysinfo*info)
{
struct sysinfo si;
get_boot_time(&info->boot_time);
if (sysinfo(&si) != 0)
{
logError("file: "__FILE__", line: %d, " \
@ -517,7 +546,6 @@ int get_sysinfo(struct fast_sysinfo*info)
info->loads[0] = si.loads[0] / (double)(1 << SI_LOAD_SHIFT);
info->loads[1] = si.loads[1] / (double)(1 << SI_LOAD_SHIFT),
info->loads[2] = si.loads[2] / (double)(1 << SI_LOAD_SHIFT);
info->uptime = si.uptime;
info->totalram = si.totalram;
info->freeram = si.freeram;
info->sharedram = si.sharedram;
@ -627,7 +655,7 @@ int get_processes(struct fast_process_info **processes, int *count)
"%s", procs[i].kp_proc.p_comm);
process->pid = procs[i].kp_proc.p_pid;
process->ppid = procs[i].kp_eproc.e_ppid;
process->starttime = procs[i].kp_proc.p_starttime.tv_sec;
process->starttime = procs[i].kp_proc.p_starttime;
process->flags = procs[i].kp_proc.p_flag;
process->state = procs[i].kp_proc.p_stat;
@ -656,8 +684,7 @@ int get_sysinfo(struct fast_sysinfo*info)
struct xsw_usage sw_usage;
memset(info, 0, sizeof(struct fast_sysinfo));
get_uptime(&uptime);
info->uptime = uptime;
get_boot_time(&info->boot_time);
mib[0] = CTL_VM;
mib[1] = VM_LOADAVG;

View File

@ -53,7 +53,7 @@ extern "C" {
#if defined(OS_LINUX) || defined(OS_FREEBSD)
struct fast_sysinfo {
long uptime; /* Seconds since boot */
struct timeval boot_time; /* system boot times */
double loads[3]; /* 1, 5, and 15 minute load averages */
unsigned long totalram; /* Total usable main memory size */
unsigned long freeram; /* Available memory size */
@ -87,7 +87,7 @@ extern "C" {
long nice;
long num_threads;
long itrealvalue;
unsigned long long starttime;
struct timeval starttime;
unsigned long vsize;
long rss;
unsigned long rsslim;
@ -127,12 +127,12 @@ int get_sys_total_mem_size(int64_t *mem_size);
*/
int get_sys_cpu_count();
/** get system up time
/** get system boot time
* parameters:
* uptime: store the up time
* return: error no , 0 success, != 0 fail
*/
int get_uptime(time_t *uptime);
int get_boot_time(struct timeval *boot_time);
/** get mounted file systems
* parameters:

View File

@ -92,8 +92,10 @@ int main(int argc, char *argv[])
printf("process count: %d\n", count);
for (i=0; i<count; i++)
{
printf("%d %d %d %d %s %lld\n", processes[i].field_count, processes[i].pid,
processes[i].ppid, processes[i].state, processes[i].comm, processes[i].starttime);
printf("%d %d %d %d %s %d.%d\n", processes[i].field_count,
processes[i].pid, processes[i].ppid, processes[i].state,
processes[i].comm, (int)processes[i].starttime.tv_sec,
(int)processes[i].starttime.tv_usec);
}
if (processes != NULL)
{
@ -102,7 +104,9 @@ int main(int argc, char *argv[])
if (get_sysinfo(&info) == 0)
{
printf("uptime: %ld\n", info.uptime);
printf("boot time: %d sec, %d usec\n",
(int)info.boot_time.tv_sec,
(int)info.boot_time.tv_usec);
printf("loads: %.2f, %.2f, %.2f\n",
info.loads[0], info.loads[1], info.loads[2]);
printf("totalram: %ld\n", info.totalram);