OSDN Git Service

Update a number of broken links in comments.
[pg-rex/syncrep.git] / src / port / getrusage.c
1 /*-------------------------------------------------------------------------
2  *
3  * getrusage.c
4  *        get information about resource utilisation
5  *
6  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  *
10  * IDENTIFICATION
11  *        $PostgreSQL: pgsql/src/port/getrusage.c,v 1.18 2010/01/02 16:58:13 momjian Exp $
12  *
13  *-------------------------------------------------------------------------
14  */
15
16 #include "c.h"
17
18 #include "rusagestub.h"
19
20 /* This code works on:
21  *              univel
22  *              solaris_i386
23  *              sco
24  *              solaris_sparc
25  *              svr4
26  *              hpux 9.*
27  *              win32
28  * which currently is all the supported platforms that don't have a
29  * native version of getrusage().  So, if configure decides to compile
30  * this file at all, we just use this version unconditionally.
31  */
32
33 int
34 getrusage(int who, struct rusage * rusage)
35 {
36 #ifdef WIN32
37
38         FILETIME        starttime;
39         FILETIME        exittime;
40         FILETIME        kerneltime;
41         FILETIME        usertime;
42         ULARGE_INTEGER li;
43
44         if (who != RUSAGE_SELF)
45         {
46                 /* Only RUSAGE_SELF is supported in this implementation for now */
47                 errno = EINVAL;
48                 return -1;
49         }
50
51         if (rusage == (struct rusage *) NULL)
52         {
53                 errno = EFAULT;
54                 return -1;
55         }
56         memset(rusage, 0, sizeof(struct rusage));
57         if (GetProcessTimes(GetCurrentProcess(),
58                                                 &starttime, &exittime, &kerneltime, &usertime) == 0)
59         {
60                 _dosmaperr(GetLastError());
61                 return -1;
62         }
63
64         /* Convert FILETIMEs (0.1 us) to struct timeval */
65         memcpy(&li, &kerneltime, sizeof(FILETIME));
66         li.QuadPart /= 10L;                     /* Convert to microseconds */
67         rusage->ru_stime.tv_sec = li.QuadPart / 1000000L;
68         rusage->ru_stime.tv_usec = li.QuadPart % 1000000L;
69
70         memcpy(&li, &usertime, sizeof(FILETIME));
71         li.QuadPart /= 10L;                     /* Convert to microseconds */
72         rusage->ru_utime.tv_sec = li.QuadPart / 1000000L;
73         rusage->ru_utime.tv_usec = li.QuadPart % 1000000L;
74 #else                                                   /* all but WIN32 */
75
76         struct tms      tms;
77         int                     tick_rate = CLK_TCK;    /* ticks per second */
78         clock_t         u,
79                                 s;
80
81         if (rusage == (struct rusage *) NULL)
82         {
83                 errno = EFAULT;
84                 return -1;
85         }
86         if (times(&tms) < 0)
87         {
88                 /* errno set by times */
89                 return -1;
90         }
91         switch (who)
92         {
93                 case RUSAGE_SELF:
94                         u = tms.tms_utime;
95                         s = tms.tms_stime;
96                         break;
97                 case RUSAGE_CHILDREN:
98                         u = tms.tms_cutime;
99                         s = tms.tms_cstime;
100                         break;
101                 default:
102                         errno = EINVAL;
103                         return -1;
104         }
105 #define TICK_TO_SEC(T, RATE)    ((T)/(RATE))
106 #define TICK_TO_USEC(T,RATE)    (((T)%(RATE)*1000000)/RATE)
107         rusage->ru_utime.tv_sec = TICK_TO_SEC(u, tick_rate);
108         rusage->ru_utime.tv_usec = TICK_TO_USEC(u, tick_rate);
109         rusage->ru_stime.tv_sec = TICK_TO_SEC(s, tick_rate);
110         rusage->ru_stime.tv_usec = TICK_TO_USEC(u, tick_rate);
111 #endif   /* WIN32 */
112
113         return 0;
114 }