1 /* resource.cc: getrusage () and friends.
3 Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2005, 2008, 2009, 2010,
4 2011, 2012 Red Hat, Inc.
6 Written by Steve Chamberlain (sac@cygnus.com), Doug Evans (dje@cygnus.com),
7 Geoffrey Noer (noer@cygnus.com) of Cygnus Support.
8 Rewritten by Sergey S. Okhapkin (sos@prospect.com.ru)
10 This file is part of Cygwin.
12 This software is a copyrighted work licensed under the terms of the
13 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
18 #include <sys/param.h>
29 /* add timeval values */
31 add_timeval (struct timeval
*tv1
, struct timeval
*tv2
)
33 tv1
->tv_sec
+= tv2
->tv_sec
;
34 tv1
->tv_usec
+= tv2
->tv_usec
;
35 if (tv1
->tv_usec
>= 1000000)
37 tv1
->tv_usec
-= 1000000;
42 /* add rusage values of r2 to r1 */
44 add_rusage (struct rusage
*r1
, struct rusage
*r2
)
46 add_timeval (&r1
->ru_utime
, &r2
->ru_utime
);
47 add_timeval (&r1
->ru_stime
, &r2
->ru_stime
);
48 r1
->ru_maxrss
+= r2
->ru_maxrss
;
49 r1
->ru_ixrss
+= r2
->ru_ixrss
;
50 r1
->ru_idrss
+= r2
->ru_idrss
;
51 r1
->ru_isrss
+= r2
->ru_isrss
;
52 r1
->ru_minflt
+= r2
->ru_minflt
;
53 r1
->ru_majflt
+= r2
->ru_majflt
;
54 r1
->ru_nswap
+= r2
->ru_nswap
;
55 r1
->ru_inblock
+= r2
->ru_inblock
;
56 r1
->ru_oublock
+= r2
->ru_oublock
;
57 r1
->ru_msgsnd
+= r2
->ru_msgsnd
;
58 r1
->ru_msgrcv
+= r2
->ru_msgrcv
;
59 r1
->ru_nsignals
+= r2
->ru_nsignals
;
60 r1
->ru_nvcsw
+= r2
->ru_nvcsw
;
61 r1
->ru_nivcsw
+= r2
->ru_nivcsw
;
64 /* FIXME: what about other fields? */
66 fill_rusage (struct rusage
*r
, HANDLE h
)
68 FILETIME creation_time
= {0,0};
69 FILETIME exit_time
= {0,0};
70 FILETIME kernel_time
= {0,0};
71 FILETIME user_time
= {0,0};
75 memset (r
, 0, sizeof (*r
));
76 GetProcessTimes (h
, &creation_time
, &exit_time
, &kernel_time
, &user_time
);
77 totimeval (&tv
, &kernel_time
, 0, 0);
78 add_timeval (&r
->ru_stime
, &tv
);
79 totimeval (&tv
, &user_time
, 0, 0);
80 add_timeval (&r
->ru_utime
, &tv
);
83 NTSTATUS status
= NtQueryInformationProcess (h
, ProcessVmCounters
, &vmc
,
85 if (NT_SUCCESS (status
))
87 r
->ru_maxrss
+= (long) (vmc
.WorkingSetSize
/ 1024);
88 r
->ru_majflt
+= vmc
.PageFaultCount
;
93 getrusage (int intwho
, struct rusage
*rusage_in
)
98 if (intwho
== RUSAGE_SELF
)
100 memset (&r
, 0, sizeof (r
));
101 fill_rusage (&r
, GetCurrentProcess ());
104 else if (intwho
== RUSAGE_CHILDREN
)
105 *rusage_in
= myself
->rusage_children
;
112 syscall_printf ("%R = getrusage(%d, %p)", res
, intwho
, rusage_in
);
117 getrlimit (int resource
, struct rlimit
*rlp
)
119 MEMORY_BASIC_INFORMATION m
;
122 if (efault
.faulted (EFAULT
))
125 rlp
->rlim_cur
= RLIM_INFINITY
;
126 rlp
->rlim_max
= RLIM_INFINITY
;
136 if (!VirtualQuery ((LPCVOID
) &m
, &m
, sizeof m
))
137 debug_printf ("couldn't get stack info, returning def.values. %E");
140 rlp
->rlim_cur
= (rlim_t
) &m
- (rlim_t
) m
.AllocationBase
;
141 rlp
->rlim_max
= (rlim_t
) m
.BaseAddress
+ m
.RegionSize
142 - (rlim_t
) m
.AllocationBase
;
146 rlp
->rlim_cur
= getdtablesize ();
147 if (rlp
->rlim_cur
< OPEN_MAX
)
148 rlp
->rlim_cur
= OPEN_MAX
;
149 rlp
->rlim_max
= OPEN_MAX_MAX
;
152 rlp
->rlim_cur
= cygheap
->rlim_core
;
162 setrlimit (int resource
, const struct rlimit
*rlp
)
165 if (efault
.faulted (EFAULT
))
168 struct rlimit oldlimits
;
170 // Check if the request is to actually change the resource settings.
171 // If it does not result in a change, take no action and do not
173 if (getrlimit (resource
, &oldlimits
) < 0)
176 if (oldlimits
.rlim_cur
== rlp
->rlim_cur
&&
177 oldlimits
.rlim_max
== rlp
->rlim_max
)
178 // No change in resource requirements, succeed immediately
184 cygheap
->rlim_core
= rlp
->rlim_cur
;
187 if (rlp
->rlim_cur
!= RLIM_INFINITY
)
188 return setdtablesize (rlp
->rlim_cur
);