blob: e59280f249dfe4c6d90dda47b9d23263b00d160a [file] [log] [blame]
Guido van Rossumf84a5391997-08-15 00:04:24 +00001
Guido van Rossum2e631391996-12-18 18:37:27 +00002#include "Python.h"
3#include <sys/resource.h>
4#include <sys/time.h>
Guido van Rossum2e631391996-12-18 18:37:27 +00005#include <string.h>
6#include <errno.h>
Martin v. Löwisf26d63b2003-03-30 17:23:49 +00007/* for sysconf */
8#if defined(HAVE_UNISTD_H)
9#include <unistd.h>
10#endif
Guido van Rossum2e631391996-12-18 18:37:27 +000011
Guido van Rossum607b33a1997-08-17 16:24:30 +000012/* On some systems, these aren't in any header file.
13 On others they are, with inconsistent prototypes.
14 We declare the (default) return type, to shut up gcc -Wall;
15 but we can't declare the prototype, to avoid errors
16 when the header files declare it different.
17 Worse, on some Linuxes, getpagesize() returns a size_t... */
Guido van Rossum2e631391996-12-18 18:37:27 +000018
19#define doubletime(TV) ((double)(TV).tv_sec + (TV).tv_usec * 0.000001)
20
Serhiy Storchaka19897632017-03-12 13:08:30 +020021/*[clinic input]
22module resource
23[clinic start generated code]*/
24/*[clinic end generated code: output=da39a3ee5e6b4b0d input=e89d38ed52609d7c]*/
25
26/*[python input]
27class pid_t_converter(CConverter):
28 type = 'pid_t'
29 format_unit = '" _Py_PARSE_PID "'
30[python start generated code]*/
31/*[python end generated code: output=da39a3ee5e6b4b0d input=0c1d19f640d57e48]*/
32
33#include "clinic/resource.c.h"
34
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000035PyDoc_STRVAR(struct_rusage__doc__,
36"struct_rusage: Result from getrusage.\n\n"
37"This object may be accessed either as a tuple of\n"
38" (utime,stime,maxrss,ixrss,idrss,isrss,minflt,majflt,\n"
39" nswap,inblock,oublock,msgsnd,msgrcv,nsignals,nvcsw,nivcsw)\n"
40"or via the attributes ru_utime, ru_stime, ru_maxrss, and so on.");
Martin v. Löwis688357e2002-04-08 21:28:20 +000041
42static PyStructSequence_Field struct_rusage_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 {"ru_utime", "user time used"},
44 {"ru_stime", "system time used"},
45 {"ru_maxrss", "max. resident set size"},
46 {"ru_ixrss", "shared memory size"},
47 {"ru_idrss", "unshared data size"},
48 {"ru_isrss", "unshared stack size"},
49 {"ru_minflt", "page faults not requiring I/O"},
50 {"ru_majflt", "page faults requiring I/O"},
51 {"ru_nswap", "number of swap outs"},
52 {"ru_inblock", "block input operations"},
53 {"ru_oublock", "block output operations"},
54 {"ru_msgsnd", "IPC messages sent"},
55 {"ru_msgrcv", "IPC messages received"},
56 {"ru_nsignals", "signals received"},
57 {"ru_nvcsw", "voluntary context switches"},
58 {"ru_nivcsw", "involuntary context switches"},
59 {0}
Martin v. Löwis688357e2002-04-08 21:28:20 +000060};
61
62static PyStructSequence_Desc struct_rusage_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 "resource.struct_rusage", /* name */
64 struct_rusage__doc__, /* doc */
65 struct_rusage_fields, /* fields */
66 16 /* n_in_sequence */
Martin v. Löwis688357e2002-04-08 21:28:20 +000067};
68
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000069static int initialized;
Martin v. Löwis688357e2002-04-08 21:28:20 +000070static PyTypeObject StructRUsageType;
71
Serhiy Storchaka19897632017-03-12 13:08:30 +020072/*[clinic input]
73resource.getrusage
74
75 who: int
76 /
77
78[clinic start generated code]*/
79
Guido van Rossum2e631391996-12-18 18:37:27 +000080static PyObject *
Serhiy Storchaka19897632017-03-12 13:08:30 +020081resource_getrusage_impl(PyObject *module, int who)
82/*[clinic end generated code: output=8fad2880ba6a9843 input=5c857bcc5b9ccb1b]*/
Guido van Rossum2e631391996-12-18 18:37:27 +000083{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 struct rusage ru;
85 PyObject *result;
Guido van Rossum2e631391996-12-18 18:37:27 +000086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 if (getrusage(who, &ru) == -1) {
88 if (errno == EINVAL) {
89 PyErr_SetString(PyExc_ValueError,
90 "invalid who parameter");
91 return NULL;
92 }
Benjamin Peterson2122cf72011-12-10 17:50:22 -050093 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 return NULL;
95 }
Guido van Rossum2e631391996-12-18 18:37:27 +000096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000097 result = PyStructSequence_New(&StructRUsageType);
98 if (!result)
99 return NULL;
Martin v. Löwis688357e2002-04-08 21:28:20 +0000100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101 PyStructSequence_SET_ITEM(result, 0,
102 PyFloat_FromDouble(doubletime(ru.ru_utime)));
103 PyStructSequence_SET_ITEM(result, 1,
104 PyFloat_FromDouble(doubletime(ru.ru_stime)));
105 PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong(ru.ru_maxrss));
106 PyStructSequence_SET_ITEM(result, 3, PyLong_FromLong(ru.ru_ixrss));
107 PyStructSequence_SET_ITEM(result, 4, PyLong_FromLong(ru.ru_idrss));
108 PyStructSequence_SET_ITEM(result, 5, PyLong_FromLong(ru.ru_isrss));
109 PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(ru.ru_minflt));
110 PyStructSequence_SET_ITEM(result, 7, PyLong_FromLong(ru.ru_majflt));
111 PyStructSequence_SET_ITEM(result, 8, PyLong_FromLong(ru.ru_nswap));
112 PyStructSequence_SET_ITEM(result, 9, PyLong_FromLong(ru.ru_inblock));
113 PyStructSequence_SET_ITEM(result, 10, PyLong_FromLong(ru.ru_oublock));
114 PyStructSequence_SET_ITEM(result, 11, PyLong_FromLong(ru.ru_msgsnd));
115 PyStructSequence_SET_ITEM(result, 12, PyLong_FromLong(ru.ru_msgrcv));
116 PyStructSequence_SET_ITEM(result, 13, PyLong_FromLong(ru.ru_nsignals));
117 PyStructSequence_SET_ITEM(result, 14, PyLong_FromLong(ru.ru_nvcsw));
118 PyStructSequence_SET_ITEM(result, 15, PyLong_FromLong(ru.ru_nivcsw));
Martin v. Löwis688357e2002-04-08 21:28:20 +0000119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120 if (PyErr_Occurred()) {
121 Py_DECREF(result);
122 return NULL;
123 }
Martin v. Löwis688357e2002-04-08 21:28:20 +0000124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 return result;
Guido van Rossum2e631391996-12-18 18:37:27 +0000126}
127
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200128static int
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200129py2rlimit(PyObject *limits, struct rlimit *rl_out)
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200130{
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200131 PyObject *curobj, *maxobj;
132 limits = PySequence_Tuple(limits);
133 if (!limits)
134 /* Here limits is a borrowed reference */
135 return -1;
136
137 if (PyTuple_GET_SIZE(limits) != 2) {
138 PyErr_SetString(PyExc_ValueError,
139 "expected a tuple of 2 integers");
140 goto error;
141 }
142 curobj = PyTuple_GET_ITEM(limits, 0);
143 maxobj = PyTuple_GET_ITEM(limits, 1);
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200144#if !defined(HAVE_LARGEFILE_SUPPORT)
145 rl_out->rlim_cur = PyLong_AsLong(curobj);
146 if (rl_out->rlim_cur == (rlim_t)-1 && PyErr_Occurred())
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200147 goto error;
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200148 rl_out->rlim_max = PyLong_AsLong(maxobj);
149 if (rl_out->rlim_max == (rlim_t)-1 && PyErr_Occurred())
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200150 goto error;
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200151#else
152 /* The limits are probably bigger than a long */
153 rl_out->rlim_cur = PyLong_AsLongLong(curobj);
154 if (rl_out->rlim_cur == (rlim_t)-1 && PyErr_Occurred())
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200155 goto error;
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200156 rl_out->rlim_max = PyLong_AsLongLong(maxobj);
157 if (rl_out->rlim_max == (rlim_t)-1 && PyErr_Occurred())
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200158 goto error;
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200159#endif
160
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200161 Py_DECREF(limits);
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200162 rl_out->rlim_cur = rl_out->rlim_cur & RLIM_INFINITY;
163 rl_out->rlim_max = rl_out->rlim_max & RLIM_INFINITY;
164 return 0;
165
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200166error:
167 Py_DECREF(limits);
168 return -1;
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200169}
170
171static PyObject*
172rlimit2py(struct rlimit rl)
173{
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200174 if (sizeof(rl.rlim_cur) > sizeof(long)) {
175 return Py_BuildValue("LL",
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700176 (long long) rl.rlim_cur,
177 (long long) rl.rlim_max);
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200178 }
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200179 return Py_BuildValue("ll", (long) rl.rlim_cur, (long) rl.rlim_max);
180}
Guido van Rossum2e631391996-12-18 18:37:27 +0000181
Serhiy Storchaka19897632017-03-12 13:08:30 +0200182/*[clinic input]
183resource.getrlimit
184
185 resource: int
186 /
187
188[clinic start generated code]*/
189
Guido van Rossum2e631391996-12-18 18:37:27 +0000190static PyObject *
Serhiy Storchaka19897632017-03-12 13:08:30 +0200191resource_getrlimit_impl(PyObject *module, int resource)
192/*[clinic end generated code: output=98327b25061ffe39 input=a697cb0004cb3c36]*/
Guido van Rossum2e631391996-12-18 18:37:27 +0000193{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 struct rlimit rl;
Guido van Rossum2e631391996-12-18 18:37:27 +0000195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000196 if (resource < 0 || resource >= RLIM_NLIMITS) {
197 PyErr_SetString(PyExc_ValueError,
198 "invalid resource specified");
199 return NULL;
200 }
Guido van Rossum2e631391996-12-18 18:37:27 +0000201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 if (getrlimit(resource, &rl) == -1) {
Benjamin Peterson2122cf72011-12-10 17:50:22 -0500203 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 return NULL;
205 }
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200206 return rlimit2py(rl);
Guido van Rossum2e631391996-12-18 18:37:27 +0000207}
208
Serhiy Storchaka19897632017-03-12 13:08:30 +0200209/*[clinic input]
210resource.setrlimit
211
212 resource: int
213 limits: object
214 /
215
216[clinic start generated code]*/
217
Guido van Rossum2e631391996-12-18 18:37:27 +0000218static PyObject *
Serhiy Storchaka19897632017-03-12 13:08:30 +0200219resource_setrlimit_impl(PyObject *module, int resource, PyObject *limits)
220/*[clinic end generated code: output=4e82ec3f34d013d1 input=6235a6ce23b4ca75]*/
Guido van Rossum2e631391996-12-18 18:37:27 +0000221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 struct rlimit rl;
Guido van Rossum2e631391996-12-18 18:37:27 +0000223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 if (resource < 0 || resource >= RLIM_NLIMITS) {
225 PyErr_SetString(PyExc_ValueError,
226 "invalid resource specified");
227 return NULL;
228 }
Guido van Rossum2e631391996-12-18 18:37:27 +0000229
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200230 if (py2rlimit(limits, &rl) < 0) {
Serhiy Storchaka19c4e0d2013-02-04 12:47:24 +0200231 return NULL;
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200232 }
Guido van Rossum763737b1999-01-06 18:44:57 +0000233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 if (setrlimit(resource, &rl) == -1) {
235 if (errno == EINVAL)
236 PyErr_SetString(PyExc_ValueError,
237 "current limit exceeds maximum limit");
238 else if (errno == EPERM)
239 PyErr_SetString(PyExc_ValueError,
240 "not allowed to raise maximum limit");
241 else
Benjamin Peterson2122cf72011-12-10 17:50:22 -0500242 PyErr_SetFromErrno(PyExc_OSError);
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200243 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 }
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200245 Py_RETURN_NONE;
Guido van Rossum2e631391996-12-18 18:37:27 +0000246}
247
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200248#ifdef HAVE_PRLIMIT
Serhiy Storchaka19897632017-03-12 13:08:30 +0200249/*[clinic input]
250resource.prlimit
251
252 pid: pid_t
253 resource: int
254 [
255 limits: object
256 ]
257 /
258
259[clinic start generated code]*/
260
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200261static PyObject *
Serhiy Storchaka19897632017-03-12 13:08:30 +0200262resource_prlimit_impl(PyObject *module, pid_t pid, int resource,
263 int group_right_1, PyObject *limits)
264/*[clinic end generated code: output=ee976b393187a7a3 input=b77743bdccc83564]*/
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200265{
266 struct rlimit old_limit, new_limit;
Serhiy Storchaka19897632017-03-12 13:08:30 +0200267 int retval;
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200268
269 if (resource < 0 || resource >= RLIM_NLIMITS) {
270 PyErr_SetString(PyExc_ValueError,
271 "invalid resource specified");
272 return NULL;
273 }
274
Serhiy Storchaka19897632017-03-12 13:08:30 +0200275 if (group_right_1) {
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200276 if (py2rlimit(limits, &new_limit) < 0) {
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200277 return NULL;
278 }
279 retval = prlimit(pid, resource, &new_limit, &old_limit);
280 }
281 else {
282 retval = prlimit(pid, resource, NULL, &old_limit);
283 }
284
285 if (retval == -1) {
286 if (errno == EINVAL) {
287 PyErr_SetString(PyExc_ValueError,
288 "current limit exceeds maximum limit");
289 } else {
290 PyErr_SetFromErrno(PyExc_OSError);
291 }
292 return NULL;
293 }
294 return rlimit2py(old_limit);
295}
296#endif /* HAVE_PRLIMIT */
297
Serhiy Storchaka19897632017-03-12 13:08:30 +0200298/*[clinic input]
299resource.getpagesize -> int
300[clinic start generated code]*/
301
302static int
303resource_getpagesize_impl(PyObject *module)
304/*[clinic end generated code: output=9ba93eb0f3d6c3a9 input=546545e8c1f42085]*/
Guido van Rossum2e631391996-12-18 18:37:27 +0000305{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 long pagesize = 0;
Martin v. Löwisf26d63b2003-03-30 17:23:49 +0000307#if defined(HAVE_GETPAGESIZE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 pagesize = getpagesize();
Martin v. Löwisf26d63b2003-03-30 17:23:49 +0000309#elif defined(HAVE_SYSCONF)
Martin v. Löwis0cb3c632004-08-12 13:26:56 +0000310#if defined(_SC_PAGE_SIZE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 pagesize = sysconf(_SC_PAGE_SIZE);
Martin v. Löwis0cb3c632004-08-12 13:26:56 +0000312#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 /* Irix 5.3 has _SC_PAGESIZE, but not _SC_PAGE_SIZE */
314 pagesize = sysconf(_SC_PAGESIZE);
Martin v. Löwis0cb3c632004-08-12 13:26:56 +0000315#endif
Martin v. Löwisf26d63b2003-03-30 17:23:49 +0000316#endif
Serhiy Storchaka19897632017-03-12 13:08:30 +0200317 return pagesize;
Guido van Rossum2e631391996-12-18 18:37:27 +0000318}
319
320/* List of functions */
321
322static struct PyMethodDef
323resource_methods[] = {
Serhiy Storchaka19897632017-03-12 13:08:30 +0200324 RESOURCE_GETRUSAGE_METHODDEF
325 RESOURCE_GETRLIMIT_METHODDEF
326 RESOURCE_PRLIMIT_METHODDEF
327 RESOURCE_SETRLIMIT_METHODDEF
328 RESOURCE_GETPAGESIZE_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000329 {NULL, NULL} /* sentinel */
Guido van Rossum2e631391996-12-18 18:37:27 +0000330};
331
332
333/* Module initialization */
334
Martin v. Löwis1a214512008-06-11 05:26:20 +0000335
336static struct PyModuleDef resourcemodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 PyModuleDef_HEAD_INIT,
338 "resource",
339 NULL,
340 -1,
341 resource_methods,
342 NULL,
343 NULL,
344 NULL,
345 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +0000346};
347
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000348PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +0000349PyInit_resource(void)
Guido van Rossum2e631391996-12-18 18:37:27 +0000350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 PyObject *m, *v;
Guido van Rossum2e631391996-12-18 18:37:27 +0000352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 /* Create the module and add the functions */
354 m = PyModule_Create(&resourcemodule);
355 if (m == NULL)
356 return NULL;
Guido van Rossum2e631391996-12-18 18:37:27 +0000357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 /* Add some symbolic constants to the module */
Benjamin Peterson2122cf72011-12-10 17:50:22 -0500359 Py_INCREF(PyExc_OSError);
360 PyModule_AddObject(m, "error", PyExc_OSError);
Victor Stinner1c8f0592013-07-22 22:24:54 +0200361 if (!initialized) {
362 if (PyStructSequence_InitType2(&StructRUsageType,
363 &struct_rusage_desc) < 0)
364 return NULL;
365 }
366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 Py_INCREF(&StructRUsageType);
368 PyModule_AddObject(m, "struct_rusage",
369 (PyObject*) &StructRUsageType);
Guido van Rossum2e631391996-12-18 18:37:27 +0000370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 /* insert constants */
Guido van Rossum2e631391996-12-18 18:37:27 +0000372#ifdef RLIMIT_CPU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200373 PyModule_AddIntMacro(m, RLIMIT_CPU);
Guido van Rossum2e631391996-12-18 18:37:27 +0000374#endif
375
376#ifdef RLIMIT_FSIZE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200377 PyModule_AddIntMacro(m, RLIMIT_FSIZE);
Guido van Rossum2e631391996-12-18 18:37:27 +0000378#endif
379
380#ifdef RLIMIT_DATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200381 PyModule_AddIntMacro(m, RLIMIT_DATA);
Guido van Rossum2e631391996-12-18 18:37:27 +0000382#endif
383
384#ifdef RLIMIT_STACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200385 PyModule_AddIntMacro(m, RLIMIT_STACK);
Guido van Rossum2e631391996-12-18 18:37:27 +0000386#endif
387
388#ifdef RLIMIT_CORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200389 PyModule_AddIntMacro(m, RLIMIT_CORE);
Guido van Rossum2e631391996-12-18 18:37:27 +0000390#endif
391
392#ifdef RLIMIT_NOFILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200393 PyModule_AddIntMacro(m, RLIMIT_NOFILE);
Guido van Rossum2e631391996-12-18 18:37:27 +0000394#endif
395
396#ifdef RLIMIT_OFILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200397 PyModule_AddIntMacro(m, RLIMIT_OFILE);
Guido van Rossum2e631391996-12-18 18:37:27 +0000398#endif
399
400#ifdef RLIMIT_VMEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200401 PyModule_AddIntMacro(m, RLIMIT_VMEM);
Guido van Rossum2e631391996-12-18 18:37:27 +0000402#endif
403
404#ifdef RLIMIT_AS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200405 PyModule_AddIntMacro(m, RLIMIT_AS);
Guido van Rossum2e631391996-12-18 18:37:27 +0000406#endif
407
408#ifdef RLIMIT_RSS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200409 PyModule_AddIntMacro(m, RLIMIT_RSS);
Guido van Rossum2e631391996-12-18 18:37:27 +0000410#endif
411
412#ifdef RLIMIT_NPROC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200413 PyModule_AddIntMacro(m, RLIMIT_NPROC);
Guido van Rossum2e631391996-12-18 18:37:27 +0000414#endif
415
416#ifdef RLIMIT_MEMLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200417 PyModule_AddIntMacro(m, RLIMIT_MEMLOCK);
Guido van Rossum2e631391996-12-18 18:37:27 +0000418#endif
419
Thomas Wouters89f507f2006-12-13 04:49:30 +0000420#ifdef RLIMIT_SBSIZE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200421 PyModule_AddIntMacro(m, RLIMIT_SBSIZE);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000422#endif
423
Christian Heimes6fc79bf2013-10-22 11:09:27 +0200424/* Linux specific */
425#ifdef RLIMIT_MSGQUEUE
426 PyModule_AddIntMacro(m, RLIMIT_MSGQUEUE);
427#endif
428
429#ifdef RLIMIT_NICE
430 PyModule_AddIntMacro(m, RLIMIT_NICE);
431#endif
432
433#ifdef RLIMIT_RTPRIO
434 PyModule_AddIntMacro(m, RLIMIT_RTPRIO);
435#endif
436
437#ifdef RLIMIT_RTTIME
438 PyModule_AddIntMacro(m, RLIMIT_RTTIME);
439#endif
440
441#ifdef RLIMIT_SIGPENDING
442 PyModule_AddIntMacro(m, RLIMIT_SIGPENDING);
443#endif
444
445/* target */
Guido van Rossum2e631391996-12-18 18:37:27 +0000446#ifdef RUSAGE_SELF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200447 PyModule_AddIntMacro(m, RUSAGE_SELF);
Guido van Rossum2e631391996-12-18 18:37:27 +0000448#endif
449
Guido van Rossumebd05eb1997-12-09 19:35:48 +0000450#ifdef RUSAGE_CHILDREN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200451 PyModule_AddIntMacro(m, RUSAGE_CHILDREN);
Guido van Rossum2e631391996-12-18 18:37:27 +0000452#endif
453
454#ifdef RUSAGE_BOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200455 PyModule_AddIntMacro(m, RUSAGE_BOTH);
Guido van Rossum2e631391996-12-18 18:37:27 +0000456#endif
Neil Schemenauer29ac3cb2002-03-24 22:27:39 +0000457
Antoine Pitroub6d4ee52010-11-17 16:19:35 +0000458#ifdef RUSAGE_THREAD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200459 PyModule_AddIntMacro(m, RUSAGE_THREAD);
Antoine Pitroub6d4ee52010-11-17 16:19:35 +0000460#endif
461
Christian Heimes5bb414d2013-12-08 14:35:55 +0100462/* FreeBSD specific */
463
464#ifdef RLIMIT_SWAP
465 PyModule_AddIntMacro(m, RLIMIT_SWAP);
466#endif
467
468#ifdef RLIMIT_SBSIZE
469 PyModule_AddIntMacro(m, RLIMIT_SBSIZE);
470#endif
471
472#ifdef RLIMIT_NPTS
473 PyModule_AddIntMacro(m, RLIMIT_NPTS);
474#endif
475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 if (sizeof(RLIM_INFINITY) > sizeof(long)) {
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700477 v = PyLong_FromLongLong((long long) RLIM_INFINITY);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 } else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 {
480 v = PyLong_FromLong((long) RLIM_INFINITY);
481 }
482 if (v) {
483 PyModule_AddObject(m, "RLIM_INFINITY", v);
484 }
485 initialized = 1;
486 return m;
Guido van Rossum2e631391996-12-18 18:37:27 +0000487}