clock.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*
  2. * clock - determine the processor time used
  3. */
  4. /* $Id$ */
  5. #include <time.h>
  6. #if defined(__BSD4_2)
  7. struct timeval {
  8. long tv_sec; /* seconds */
  9. long tv_usec; /* and microseconds */
  10. };
  11. #define RUSAGE_SELF 0
  12. #define RUSAGE_CHILDREN -1
  13. struct rusage {
  14. struct timeval ru_utime; /* user time used */
  15. struct timeval ru_stime; /* system time used */
  16. long ru_maxrss;
  17. long ru_ixrss; /* integral shared memory size */
  18. long ru_idrss; /* integral unshared data size */
  19. long ru_isrss; /* integral unshared stack size */
  20. long ru_minflt; /* page reclaims */
  21. long ru_majflt; /* page faults */
  22. long ru_nswap; /* swaps */
  23. long ru_inblock; /* block input operations */
  24. long ru_oublock; /* block output operations */
  25. long ru_msgsnd; /* messages sent */
  26. long ru_msgrcv; /* messages received */
  27. long ru_nsignals; /* signals received */
  28. long ru_nvcsw; /* voluntary context switches */
  29. long ru_nivcsw; /* involuntary context switches */
  30. };
  31. void _getrusage(int who, struct rusage *rusage);
  32. #elif defined(_POSIX_SOURCE) || defined(__USG)
  33. struct tms {
  34. time_t tms_utime; /* user time */
  35. time_t tms_stime; /* system time */
  36. time_t tms_cutime; /* user time, children */
  37. time_t tms_cstime; /* system time, children */
  38. };
  39. long _times(struct tms *buffer);
  40. #else /* Version 7 UNIX */
  41. struct tbuffer {
  42. long proc_user_time;
  43. long proc_system_time;
  44. long child_user_time;
  45. long child_system_time;
  46. };
  47. long _times(struct tbuffer *buffer);
  48. #endif
  49. clock_t
  50. clock(void)
  51. {
  52. #if defined(__BSD4_2)
  53. struct rusage rusage;
  54. _getrusage(RUSAGE_SELF, &rusage);
  55. return (((unsigned long)rusage.ru_utime.tv_sec * CLOCKS_PER_SEC)
  56. + rusage.ru_utime.tv_usec);
  57. #elif defined(_POSIX_SOURCE) || defined(__USG)
  58. struct tms tms;
  59. _times(&tms);
  60. /* Assume that time_t can be converted to clock_t for Sys5 */
  61. return tms.tms_utime;
  62. #else
  63. struct tbuffer tbuffer;
  64. _times(&tbuffer);
  65. return tbuffer.proc_user_time;
  66. #endif
  67. }