summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/ChangeLog15
-rw-r--r--lib/thread.c22
-rw-r--r--lib/thread.h2
-rw-r--r--lib/vty.c17
4 files changed, 48 insertions, 8 deletions
diff --git a/lib/ChangeLog b/lib/ChangeLog
index e5ee5494..d8328499 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,18 @@
+2005-04-16 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+ * thread.h (thread_consumed_time): Declare new function to calculate
+ elapsed microseconds.
+ * thread.c (thread_consumed_time): Must be global not static so we
+ can call it from lib/vty.c:vty_command.
+ (thread_should_yield): Surround with `#if 0' to make clear that this
+ function is not currently being used anywhere.
+ (thread_call): If CONSUMED_TIME_CHECK is defined, print a CPU HOG
+ warning message if the thread takes more than CONSUMED_TIME_CHECK
+ microseconds.
+ * vty.c (vty_command): If CONSUMED_TIME_CHECK is defined, print a CPU
+ HOG warning message if the command takes more than CONSUMED_TIME_CHECK
+ microseconds.
+
2005-04-16 Paul Jakma <paul@dishone.st>
* memtypes.c: the comment about use of comments in the comments
diff --git a/lib/thread.c b/lib/thread.c
index 05212d85..d1c925c4 100644
--- a/lib/thread.c
+++ b/lib/thread.c
@@ -804,7 +804,7 @@ thread_fetch (struct thread_master *m, struct thread *fetch)
}
}
-static unsigned long
+unsigned long
thread_consumed_time (RUSAGE_T *now, RUSAGE_T *start)
{
unsigned long thread_time;
@@ -821,6 +821,10 @@ thread_consumed_time (RUSAGE_T *now, RUSAGE_T *start)
return thread_time;
}
+#if 0
+
+/* This function is not currently used: threads never yield! */
+
/* We should aim to yield after THREAD_YIELD_TIME_SLOT
milliseconds. */
int
@@ -836,6 +840,8 @@ thread_should_yield (struct thread *thread)
return 0;
}
+#endif
+
/* We check thread consumed time. If the system has getrusage, we'll
use that to get indepth stats on the performance of the thread. If
not - we'll use gettimeofday for some guestimation. */
@@ -864,20 +870,20 @@ thread_call (struct thread *thread)
++cpu->total_calls;
cpu->types |= (1 << thread->add_type);
-#ifdef THREAD_CONSUMED_TIME_CHECK
- if (thread_time > 200000L)
+#ifdef CONSUMED_TIME_CHECK
+ if (thread_time > CONSUMED_TIME_CHECK)
{
/*
* We have a CPU Hog on our hands.
* Whinge about it now, so we're aware this is yet another task
* to fix.
*/
- zlog_err ("CPU HOG task %s (%lx) ran for %ldms",
- thread->funcname,
- (unsigned long) thread->func,
- thread_time / 1000L);
+ zlog_warn ("CPU HOG: task %s (%lx) ran for %ldms",
+ thread->funcname,
+ (unsigned long) thread->func,
+ thread_time / 1000L);
}
-#endif /* THREAD_CONSUMED_TIME_CHECK */
+#endif /* CONSUMED_TIME_CHECK */
}
/* Execute thread */
diff --git a/lib/thread.h b/lib/thread.h
index 716a6a6c..4008ba72 100644
--- a/lib/thread.h
+++ b/lib/thread.h
@@ -158,4 +158,6 @@ unsigned long thread_timer_remain_second (struct thread *);
extern struct cmd_element show_thread_cpu_cmd;
+extern unsigned long thread_consumed_time(RUSAGE_T *after, RUSAGE_T *before);
+
#endif /* _ZEBRA_THREAD_H */
diff --git a/lib/vty.c b/lib/vty.c
index 600c9fd8..ea74172c 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -395,8 +395,25 @@ vty_command (struct vty *vty, char *buf)
if (vline == NULL)
return CMD_SUCCESS;
+#ifdef CONSUMED_TIME_CHECK
+ {
+ RUSAGE_T before;
+ RUSAGE_T after;
+ unsigned long cmdtime;
+
+ GETRUSAGE(&before);
+#endif /* CONSUMED_TIME_CHECK */
+
ret = cmd_execute_command (vline, vty, NULL, 0);
+#ifdef CONSUMED_TIME_CHECK
+ GETRUSAGE(&after);
+ if ((cmdtime = thread_consumed_time(&after, &before)) > CONSUMED_TIME_CHECK)
+ /* Warn about CPU hog that must be fixed. */
+ zlog_warn("CPU HOG: command took %lums: %s", cmdtime/1000, buf);
+ }
+#endif /* CONSUMED_TIME_CHECK */
+
if (ret != CMD_SUCCESS)
switch (ret)
{