/mode-line/modeline-cpu.lisp

http://github.com/joelagnel/stumpwm-goodies · Lisp · 48 lines · 42 code · 3 blank · 3 comment · 2 complexity · 2a7e67872eb4f6f3200d522743583633 MD5 · raw file

  1. (defvar *prev-user-cpu* 0)
  2. (defvar *prev-sys-cpu* 0)
  3. (defvar *prev-idle-cpu* 0)
  4. (defvar *prev-iowait* 0)
  5. (defun current-cpu-usage ()
  6. "Return the average CPU usage since the last call.
  7. First value is percent of CPU in use.
  8. Second value is percent of CPU in use by system processes.
  9. Third value is percent of time since last call spent waiting for IO (or 0 if not available)."
  10. (let ((cpu-result 0)
  11. (sys-result 0)
  12. (io-result nil))
  13. (with-open-file (in "/proc/stat" :direction :input)
  14. (if (eq 'cpu (read in))
  15. (let* ((norm-user (read in))
  16. (nice-user (read in))
  17. (user (+ norm-user nice-user))
  18. (sys (read in))
  19. (idle (read in))
  20. (iowait (or (ignore-errors (read in)) 0))
  21. (step-denom (- (+ user sys idle iowait)
  22. (+ *prev-user-cpu* *prev-sys-cpu* *prev-idle-cpu* *prev-iowait*))))
  23. (setf cpu-result (/ (- (+ user sys)
  24. (+ *prev-user-cpu* *prev-sys-cpu*))
  25. step-denom)
  26. sys-result (/ (- sys *prev-sys-cpu*)
  27. step-denom)
  28. io-result (/ (- iowait *prev-iowait*)
  29. step-denom)
  30. *prev-user-cpu* user
  31. *prev-sys-cpu* sys
  32. *prev-idle-cpu* idle
  33. *prev-iowait* iowait))
  34. (warn "Unexpected header")))
  35. (values cpu-result sys-result io-result)))
  36. (defun format-current-cpu-usage (stream)
  37. "Formats a string representing the current processor usage to STREAM.
  38. Arguments are as those to FORMAT, so NIL returns a formatted string and T prints to standard
  39. output."
  40. (multiple-value-bind (cpu sys io) (current-cpu-usage)
  41. (declare (ignore sys))
  42. (format stream "[cpu:~3D%] [io:~3D%]" (truncate (* 100 cpu)) (if io (truncate (* 100 io)) 0))))
  43. ;; (setf *screen-mode-line-format* (list "%w "
  44. ;; ;; ... some other modeline settings ...
  45. ;; '(:eval (format-current-cpu-usage nil))))