summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMadhusudan.C.S <madhusudancs@gmail.com>2008-08-18 19:34:00 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2010-08-01 01:30:30 +0200
commitac38ed88929c70c4ede56816c053bf170c9c2efd (patch)
tree83f8856d12c8928380256f3e3c6a3e53733db900
parent415e86d598c4e15d69b5f558d305b735462083bc (diff)
2008-08-18 Madhusudan.C.S <madhusudancs@gmail.com>
* procfs_nonpid_files.c: (get_uptime): Changed the parameter type from double to struct timeval. Changed the parameter name from uptime_secs to uptime. Removed uptime variable. Changed timersub to use the passed pointer instead of the local variable. Removed the calculation of uptime_secs. (get_total_times): Changed the parameters type from double to struct timeval. Changed the parameters name from total_user_time_secs to total_user_time and total_system_time_secs to total_system_time. New variables total_user_time_tmp, total_system_time_tmp and tmpval of type struct timeval. Call timerclear to clear the tmp variables. Remove calculation of times in seconds and do the same on struct timeval variables throughout using the timeradd macro. Assign values of temporary local variables to the pointers passed as parameters. (procfs_write_nonpid_stat): Replaced variables that hold time in seconds with struct timeval type variables and jiffy_t type variables. Argument to get_uptime changed from uptime_secs to uptime. Arguments to get_total_times changed from total_user_time_secs to total_user_time and total_system_time_secs to total_system_time. Replace arithematic time subtraction with timersub macro. Convert all the times in struct timeval type variables to jiffy_t type. Changed the type casting for the asprintf arguments to be compatible with jiffy_t type. (procfs_write_nonpid_uptime): Replaced variables that hold time in seconds with struct timeval type variables. Argument to get_uptime changed from uptime_secs to uptime. Arguments to get_total_times changed from total_user_time_secs to total_user_time and total_system_time_secs to total_system_time. Replace arithematic time subtraction with timersub macro. Convert all the times in struct timeval type variables to seconds.
-rw-r--r--procfs_nonpid_files.c138
1 files changed, 87 insertions, 51 deletions
diff --git a/procfs_nonpid_files.c b/procfs_nonpid_files.c
index ab1341ff..9cb0c57a 100644
--- a/procfs_nonpid_files.c
+++ b/procfs_nonpid_files.c
@@ -166,9 +166,9 @@ error_t procfs_create_loadavg (struct procfs_dir *dir,
return err;
}
-error_t get_uptime (double *uptime_secs)
+error_t get_uptime (struct timeval *uptime)
{
- struct timeval boot_time, uptime, now;
+ struct timeval boot_time, now;
error_t err;
struct proc_stat *ps;
@@ -188,15 +188,15 @@ error_t get_uptime (double *uptime_secs)
boot_time.tv_usec = tv->microseconds;
if (gettimeofday (&now, 0) < 0)
error (0, errno, "gettimeofday");
- timersub (&now, &boot_time, &uptime);
- *uptime_secs = (double)uptime.tv_sec + ((double)uptime.tv_usec / 1000000);
+ timersub (&now, &boot_time, uptime);
}
_proc_stat_free (ps);
return err;
}
-error_t get_total_times (double *total_user_time_secs , double *total_system_time_secs )
+error_t get_total_times (struct timeval *total_user_time,
+ struct timeval *total_system_time)
{
error_t err;
pid_t *pids;
@@ -204,8 +204,12 @@ error_t get_total_times (double *total_user_time_secs , double *total_system_tim
struct proc_stat *ps;
struct task_thread_times_info live_threads_times;
- *total_user_time_secs = 0;
- *total_system_time_secs = 0;
+ struct timeval total_user_time_tmp;
+ struct timeval total_system_time_tmp;
+ struct timeval tmpval;
+
+ timerclear (&total_user_time_tmp);
+ timerclear (&total_system_time_tmp);
pids = NULL;
err = proc_getallpids (getproc (), &pids, &pidslen);
@@ -222,33 +226,40 @@ error_t get_total_times (double *total_user_time_secs , double *total_system_tim
err = EGRATUITOUS;
if (! err)
- {
- *total_user_time_secs +=
- ((double) (proc_stat_task_basic_info (ps)->user_time.seconds)) +
- (((double) (proc_stat_task_basic_info (ps)->user_time.microseconds)) /
- (1000 * 1000));
+ {
+ tmpval.tv_sec = proc_stat_task_basic_info (ps)->user_time.seconds;
+ tmpval.tv_usec = proc_stat_task_basic_info (ps)->user_time.seconds;
+ timeradd (&total_user_time_tmp, &tmpval, &total_user_time_tmp);
+
+ tmpval.tv_sec = proc_stat_task_basic_info (ps)->system_time.seconds;
+ tmpval.tv_usec = proc_stat_task_basic_info (ps)->system_time.seconds;
+ timeradd (&total_system_time_tmp, &tmpval, &total_system_time_tmp);
- *total_system_time_secs +=
- ((double) (proc_stat_task_basic_info (ps)->system_time.seconds)) +
- (((double) (proc_stat_task_basic_info (ps)->system_time.microseconds)) / (1000 * 1000));
-
error_t err = set_field_value (ps, PSTAT_TASK);
if (! err)
{
err = get_task_thread_times (ps->task, &live_threads_times);
if (! err)
{
- *total_user_time_secs += ((double) (live_threads_times.user_time.seconds)) +
- (((double) (live_threads_times.user_time.microseconds)) / (1000 * 1000));
- *total_system_time_secs += ((double) (live_threads_times.system_time.seconds)) +
- (((double) (live_threads_times.system_time.microseconds)) / (1000 * 1000));
-
+ tmpval.tv_sec = live_threads_times.user_time.seconds;
+ tmpval.tv_usec = live_threads_times.user_time.microseconds;
+ timeradd (&total_user_time_tmp, &tmpval, &total_user_time_tmp);
+
+ tmpval.tv_sec = live_threads_times.system_time.seconds;
+ tmpval.tv_usec = live_threads_times.system_time.microseconds;
+ timeradd (&total_system_time_tmp, &tmpval, &total_system_time_tmp);
}
}
}
_proc_stat_free (ps);
}
-
+
+ total_user_time->tv_sec = total_user_time_tmp.tv_sec;
+ total_user_time->tv_usec = total_user_time_tmp.tv_usec;
+
+ total_system_time->tv_sec = total_system_time_tmp.tv_sec;
+ total_system_time->tv_usec = total_system_time_tmp.tv_usec;
+
return err;
}
@@ -257,30 +268,45 @@ error_t procfs_write_nonpid_stat (struct dir_entry *dir_entry,
{
char *stat_data;
error_t err;
- double uptime_secs, total_user_time_secs;
- double total_system_time_secs, idle_time_secs;
+ jiffy_t total_user_time_jiffy, total_system_time_jiffy;
+ jiffy_t idle_time_jiffy;
+ struct timeval uptime, total_user_time, total_system_time;
+ struct timeval idle_time;
- err = get_uptime (&uptime_secs);
+ err = get_uptime (&uptime);
+
if (! err)
{
- err = get_total_times (&total_user_time_secs, &total_system_time_secs);
+ err = get_total_times (&total_user_time, &total_system_time);
+
if (! err)
{
- idle_time_secs = uptime_secs -
- total_system_time_secs;
-
- /* If the values are multiplied by 100, it is done so to adjust
- values in seconds to jiffies. */
- if (asprintf (&stat_data, "cpu %ld %ld %ld %ld %ld %ld %d %d %d\n"
- "cpu0 %ld %ld %ld %ld %ld %ld %d %d %d\n"
- "intr %ld %ld %ld %ld %ld %ld %d %d %d\n",
- (long)(total_user_time_secs * 100), 0,
- (long)(total_system_time_secs * 100),
- (long) (idle_time_secs * 100), 0, 0, 0, 0,
- 0, (long)(total_user_time_secs * 100), 0,
- (long)(total_system_time_secs * 100),
- (long)(idle_time_secs * 100), 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) == -1)
+ timersub (&uptime, &total_system_time,
+ &idle_time);
+
+ total_user_time_jiffy = 100 * ((double) total_user_time.tv_sec +
+ (double) total_user_time.tv_usec / (1000 * 1000));
+ total_system_time_jiffy = 100 * ((double) total_system_time.tv_sec +
+ (double) total_system_time.tv_usec / (1000 * 1000));
+ idle_time_jiffy = 100 * ((double) idle_time.tv_sec +
+ (double) idle_time.tv_usec / (1000 * 1000));
+
+ if (asprintf (&stat_data, "cpu %llu %llu %llu %llu %llu %llu %d %d %d\n"
+ "cpu0 %llu %llu %llu %llu %llu %llu %d %d %d\n"
+ "intr %llu %llu %llu %llu %llu %llu %d %d %d\n",
+ total_user_time_jiffy, (long long unsigned) 0,
+ total_system_time_jiffy, idle_time_jiffy,
+ (long long unsigned) 0, (long long unsigned) 0,
+ 0, 0, 0,
+ total_user_time_jiffy, (long long unsigned) 0,
+ total_system_time_jiffy, idle_time_jiffy,
+ (long long unsigned) 0, (long long unsigned) 0,
+ 0, 0, 0,
+ (long long unsigned) 0,
+ (long long unsigned) 0, (long long unsigned) 0, (long long unsigned) 0,
+ (long long unsigned) 0,
+ (long long unsigned) 0, (long long unsigned) 0,
+ (long long unsigned) 0, (long long unsigned) 0) == -1)
return errno;
}
}
@@ -434,23 +460,33 @@ error_t procfs_write_nonpid_uptime (struct dir_entry *dir_entry,
{
char *uptime_data;
error_t err;
- double uptime_secs, total_user_time_secs;
- double total_system_time_secs, idle_time_secs;
+ double uptime_secs, idle_time_secs;
+
+ struct timeval uptime_val;
+ struct timeval uptime, total_user_time, total_system_time;
+ struct timeval idle_time;
+
- err = get_uptime (&uptime_secs);
+ err = get_uptime (&uptime);
if (! err)
{
- err = get_total_times (&total_user_time_secs,
- &total_system_time_secs);
+ err = get_total_times (&total_user_time,
+ &total_system_time);
if (! err)
{
- idle_time_secs = uptime_secs -
- total_system_time_secs;
-
- if (asprintf (&uptime_data, "%.2f %.2f \n",
+ timersub (&uptime, &total_system_time,
+ &idle_time);
+
+ uptime_secs = (double) uptime.tv_sec +
+ (double) uptime.tv_usec / (1000 * 1000);
+
+ idle_time_secs = (double) idle_time.tv_sec +
+ (double) idle_time.tv_usec / (1000 * 1000);
+
+ if (asprintf (&uptime_data, "%.2f %.2f\n",
uptime_secs, idle_time_secs) == -1)
return errno;
- }
+ }
}