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