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

View File

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

View File

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