blob: 0d69c2983b4d18eeebb41bf838e21d9ddb71bf29 [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#include <unistd.h>
Guido van Rossum2e631391996-12-18 18:37:27 +00008
Guido van Rossum607b33a1997-08-17 16:24:30 +00009/* On some systems, these aren't in any header file.
10 On others they are, with inconsistent prototypes.
11 We declare the (default) return type, to shut up gcc -Wall;
12 but we can't declare the prototype, to avoid errors
13 when the header files declare it different.
14 Worse, on some Linuxes, getpagesize() returns a size_t... */
Guido van Rossum2e631391996-12-18 18:37:27 +000015
16#define doubletime(TV) ((double)(TV).tv_sec + (TV).tv_usec * 0.000001)
17
Serhiy Storchaka19897632017-03-12 13:08:30 +020018/*[clinic input]
19module resource
20[clinic start generated code]*/
21/*[clinic end generated code: output=da39a3ee5e6b4b0d input=e89d38ed52609d7c]*/
22
23/*[python input]
24class pid_t_converter(CConverter):
25 type = 'pid_t'
26 format_unit = '" _Py_PARSE_PID "'
27[python start generated code]*/
28/*[python end generated code: output=da39a3ee5e6b4b0d input=0c1d19f640d57e48]*/
29
30#include "clinic/resource.c.h"
31
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000032PyDoc_STRVAR(struct_rusage__doc__,
33"struct_rusage: Result from getrusage.\n\n"
34"This object may be accessed either as a tuple of\n"
35" (utime,stime,maxrss,ixrss,idrss,isrss,minflt,majflt,\n"
36" nswap,inblock,oublock,msgsnd,msgrcv,nsignals,nvcsw,nivcsw)\n"
37"or via the attributes ru_utime, ru_stime, ru_maxrss, and so on.");
Martin v. Löwis688357e2002-04-08 21:28:20 +000038
39static PyStructSequence_Field struct_rusage_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000040 {"ru_utime", "user time used"},
41 {"ru_stime", "system time used"},
42 {"ru_maxrss", "max. resident set size"},
43 {"ru_ixrss", "shared memory size"},
44 {"ru_idrss", "unshared data size"},
45 {"ru_isrss", "unshared stack size"},
46 {"ru_minflt", "page faults not requiring I/O"},
47 {"ru_majflt", "page faults requiring I/O"},
48 {"ru_nswap", "number of swap outs"},
49 {"ru_inblock", "block input operations"},
50 {"ru_oublock", "block output operations"},
51 {"ru_msgsnd", "IPC messages sent"},
52 {"ru_msgrcv", "IPC messages received"},
53 {"ru_nsignals", "signals received"},
54 {"ru_nvcsw", "voluntary context switches"},
55 {"ru_nivcsw", "involuntary context switches"},
56 {0}
Martin v. Löwis688357e2002-04-08 21:28:20 +000057};
58
59static PyStructSequence_Desc struct_rusage_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 "resource.struct_rusage", /* name */
61 struct_rusage__doc__, /* doc */
62 struct_rusage_fields, /* fields */
63 16 /* n_in_sequence */
Martin v. Löwis688357e2002-04-08 21:28:20 +000064};
65
Christian Heimes6d9ec8b2020-12-23 08:55:11 +010066typedef struct {
67 PyTypeObject *StructRUsageType;
68} resourcemodulestate;
69
70
71static inline resourcemodulestate*
72get_resource_state(PyObject *module)
73{
74 void *state = PyModule_GetState(module);
75 assert(state != NULL);
76 return (resourcemodulestate *)state;
77}
78
79static struct PyModuleDef resourcemodule;
Martin v. Löwis688357e2002-04-08 21:28:20 +000080
Serhiy Storchaka19897632017-03-12 13:08:30 +020081/*[clinic input]
82resource.getrusage
83
84 who: int
85 /
86
87[clinic start generated code]*/
88
Guido van Rossum2e631391996-12-18 18:37:27 +000089static PyObject *
Serhiy Storchaka19897632017-03-12 13:08:30 +020090resource_getrusage_impl(PyObject *module, int who)
91/*[clinic end generated code: output=8fad2880ba6a9843 input=5c857bcc5b9ccb1b]*/
Guido van Rossum2e631391996-12-18 18:37:27 +000092{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000093 struct rusage ru;
94 PyObject *result;
Guido van Rossum2e631391996-12-18 18:37:27 +000095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000096 if (getrusage(who, &ru) == -1) {
97 if (errno == EINVAL) {
98 PyErr_SetString(PyExc_ValueError,
99 "invalid who parameter");
100 return NULL;
101 }
Benjamin Peterson2122cf72011-12-10 17:50:22 -0500102 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 return NULL;
104 }
Guido van Rossum2e631391996-12-18 18:37:27 +0000105
Christian Heimes6d9ec8b2020-12-23 08:55:11 +0100106 result = PyStructSequence_New(
107 get_resource_state(module)->StructRUsageType);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 if (!result)
109 return NULL;
Martin v. Löwis688357e2002-04-08 21:28:20 +0000110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000111 PyStructSequence_SET_ITEM(result, 0,
112 PyFloat_FromDouble(doubletime(ru.ru_utime)));
113 PyStructSequence_SET_ITEM(result, 1,
114 PyFloat_FromDouble(doubletime(ru.ru_stime)));
115 PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong(ru.ru_maxrss));
116 PyStructSequence_SET_ITEM(result, 3, PyLong_FromLong(ru.ru_ixrss));
117 PyStructSequence_SET_ITEM(result, 4, PyLong_FromLong(ru.ru_idrss));
118 PyStructSequence_SET_ITEM(result, 5, PyLong_FromLong(ru.ru_isrss));
119 PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(ru.ru_minflt));
120 PyStructSequence_SET_ITEM(result, 7, PyLong_FromLong(ru.ru_majflt));
121 PyStructSequence_SET_ITEM(result, 8, PyLong_FromLong(ru.ru_nswap));
122 PyStructSequence_SET_ITEM(result, 9, PyLong_FromLong(ru.ru_inblock));
123 PyStructSequence_SET_ITEM(result, 10, PyLong_FromLong(ru.ru_oublock));
124 PyStructSequence_SET_ITEM(result, 11, PyLong_FromLong(ru.ru_msgsnd));
125 PyStructSequence_SET_ITEM(result, 12, PyLong_FromLong(ru.ru_msgrcv));
126 PyStructSequence_SET_ITEM(result, 13, PyLong_FromLong(ru.ru_nsignals));
127 PyStructSequence_SET_ITEM(result, 14, PyLong_FromLong(ru.ru_nvcsw));
128 PyStructSequence_SET_ITEM(result, 15, PyLong_FromLong(ru.ru_nivcsw));
Martin v. Löwis688357e2002-04-08 21:28:20 +0000129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130 if (PyErr_Occurred()) {
131 Py_DECREF(result);
132 return NULL;
133 }
Martin v. Löwis688357e2002-04-08 21:28:20 +0000134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000135 return result;
Guido van Rossum2e631391996-12-18 18:37:27 +0000136}
137
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200138static int
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200139py2rlimit(PyObject *limits, struct rlimit *rl_out)
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200140{
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200141 PyObject *curobj, *maxobj;
142 limits = PySequence_Tuple(limits);
143 if (!limits)
144 /* Here limits is a borrowed reference */
145 return -1;
146
147 if (PyTuple_GET_SIZE(limits) != 2) {
148 PyErr_SetString(PyExc_ValueError,
149 "expected a tuple of 2 integers");
150 goto error;
151 }
152 curobj = PyTuple_GET_ITEM(limits, 0);
153 maxobj = PyTuple_GET_ITEM(limits, 1);
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200154#if !defined(HAVE_LARGEFILE_SUPPORT)
155 rl_out->rlim_cur = PyLong_AsLong(curobj);
156 if (rl_out->rlim_cur == (rlim_t)-1 && PyErr_Occurred())
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200157 goto error;
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200158 rl_out->rlim_max = PyLong_AsLong(maxobj);
159 if (rl_out->rlim_max == (rlim_t)-1 && PyErr_Occurred())
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200160 goto error;
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200161#else
162 /* The limits are probably bigger than a long */
163 rl_out->rlim_cur = PyLong_AsLongLong(curobj);
164 if (rl_out->rlim_cur == (rlim_t)-1 && PyErr_Occurred())
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200165 goto error;
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200166 rl_out->rlim_max = PyLong_AsLongLong(maxobj);
167 if (rl_out->rlim_max == (rlim_t)-1 && PyErr_Occurred())
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200168 goto error;
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200169#endif
170
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200171 Py_DECREF(limits);
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200172 rl_out->rlim_cur = rl_out->rlim_cur & RLIM_INFINITY;
173 rl_out->rlim_max = rl_out->rlim_max & RLIM_INFINITY;
174 return 0;
175
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200176error:
177 Py_DECREF(limits);
178 return -1;
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200179}
180
181static PyObject*
182rlimit2py(struct rlimit rl)
183{
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200184 if (sizeof(rl.rlim_cur) > sizeof(long)) {
185 return Py_BuildValue("LL",
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700186 (long long) rl.rlim_cur,
187 (long long) rl.rlim_max);
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200188 }
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200189 return Py_BuildValue("ll", (long) rl.rlim_cur, (long) rl.rlim_max);
190}
Guido van Rossum2e631391996-12-18 18:37:27 +0000191
Serhiy Storchaka19897632017-03-12 13:08:30 +0200192/*[clinic input]
193resource.getrlimit
194
195 resource: int
196 /
197
198[clinic start generated code]*/
199
Guido van Rossum2e631391996-12-18 18:37:27 +0000200static PyObject *
Serhiy Storchaka19897632017-03-12 13:08:30 +0200201resource_getrlimit_impl(PyObject *module, int resource)
202/*[clinic end generated code: output=98327b25061ffe39 input=a697cb0004cb3c36]*/
Guido van Rossum2e631391996-12-18 18:37:27 +0000203{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 struct rlimit rl;
Guido van Rossum2e631391996-12-18 18:37:27 +0000205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 if (resource < 0 || resource >= RLIM_NLIMITS) {
207 PyErr_SetString(PyExc_ValueError,
208 "invalid resource specified");
209 return NULL;
210 }
Guido van Rossum2e631391996-12-18 18:37:27 +0000211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 if (getrlimit(resource, &rl) == -1) {
Benjamin Peterson2122cf72011-12-10 17:50:22 -0500213 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 return NULL;
215 }
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200216 return rlimit2py(rl);
Guido van Rossum2e631391996-12-18 18:37:27 +0000217}
218
Serhiy Storchaka19897632017-03-12 13:08:30 +0200219/*[clinic input]
220resource.setrlimit
221
222 resource: int
223 limits: object
224 /
225
226[clinic start generated code]*/
227
Guido van Rossum2e631391996-12-18 18:37:27 +0000228static PyObject *
Serhiy Storchaka19897632017-03-12 13:08:30 +0200229resource_setrlimit_impl(PyObject *module, int resource, PyObject *limits)
230/*[clinic end generated code: output=4e82ec3f34d013d1 input=6235a6ce23b4ca75]*/
Guido van Rossum2e631391996-12-18 18:37:27 +0000231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 struct rlimit rl;
Guido van Rossum2e631391996-12-18 18:37:27 +0000233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 if (resource < 0 || resource >= RLIM_NLIMITS) {
235 PyErr_SetString(PyExc_ValueError,
236 "invalid resource specified");
237 return NULL;
238 }
Guido van Rossum2e631391996-12-18 18:37:27 +0000239
Saiyang Gou7514f4f2020-02-12 23:47:42 -0800240 if (PySys_Audit("resource.setrlimit", "iO", resource,
241 limits ? limits : Py_None) < 0) {
242 return NULL;
243 }
244
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200245 if (py2rlimit(limits, &rl) < 0) {
Serhiy Storchaka19c4e0d2013-02-04 12:47:24 +0200246 return NULL;
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200247 }
Guido van Rossum763737b1999-01-06 18:44:57 +0000248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000249 if (setrlimit(resource, &rl) == -1) {
250 if (errno == EINVAL)
251 PyErr_SetString(PyExc_ValueError,
252 "current limit exceeds maximum limit");
253 else if (errno == EPERM)
254 PyErr_SetString(PyExc_ValueError,
255 "not allowed to raise maximum limit");
256 else
Benjamin Peterson2122cf72011-12-10 17:50:22 -0500257 PyErr_SetFromErrno(PyExc_OSError);
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200258 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 }
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200260 Py_RETURN_NONE;
Guido van Rossum2e631391996-12-18 18:37:27 +0000261}
262
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200263#ifdef HAVE_PRLIMIT
Serhiy Storchaka19897632017-03-12 13:08:30 +0200264/*[clinic input]
265resource.prlimit
266
267 pid: pid_t
268 resource: int
269 [
270 limits: object
271 ]
272 /
273
274[clinic start generated code]*/
275
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200276static PyObject *
Serhiy Storchaka19897632017-03-12 13:08:30 +0200277resource_prlimit_impl(PyObject *module, pid_t pid, int resource,
278 int group_right_1, PyObject *limits)
279/*[clinic end generated code: output=ee976b393187a7a3 input=b77743bdccc83564]*/
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200280{
281 struct rlimit old_limit, new_limit;
Serhiy Storchaka19897632017-03-12 13:08:30 +0200282 int retval;
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200283
284 if (resource < 0 || resource >= RLIM_NLIMITS) {
285 PyErr_SetString(PyExc_ValueError,
286 "invalid resource specified");
287 return NULL;
288 }
289
Saiyang Gou7514f4f2020-02-12 23:47:42 -0800290 if (PySys_Audit("resource.prlimit", "iiO", pid, resource,
291 limits ? limits : Py_None) < 0) {
292 return NULL;
293 }
294
Serhiy Storchaka19897632017-03-12 13:08:30 +0200295 if (group_right_1) {
Serhiy Storchakab94eef22016-12-19 08:04:15 +0200296 if (py2rlimit(limits, &new_limit) < 0) {
Christian Heimesb7bd5df2013-10-22 11:21:54 +0200297 return NULL;
298 }
299 retval = prlimit(pid, resource, &new_limit, &old_limit);
300 }
301 else {
302 retval = prlimit(pid, resource, NULL, &old_limit);
303 }
304
305 if (retval == -1) {
306 if (errno == EINVAL) {
307 PyErr_SetString(PyExc_ValueError,
308 "current limit exceeds maximum limit");
309 } else {
310 PyErr_SetFromErrno(PyExc_OSError);
311 }
312 return NULL;
313 }
314 return rlimit2py(old_limit);
315}
316#endif /* HAVE_PRLIMIT */
317
Serhiy Storchaka19897632017-03-12 13:08:30 +0200318/*[clinic input]
319resource.getpagesize -> int
320[clinic start generated code]*/
321
322static int
323resource_getpagesize_impl(PyObject *module)
324/*[clinic end generated code: output=9ba93eb0f3d6c3a9 input=546545e8c1f42085]*/
Guido van Rossum2e631391996-12-18 18:37:27 +0000325{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 long pagesize = 0;
Martin v. Löwisf26d63b2003-03-30 17:23:49 +0000327#if defined(HAVE_GETPAGESIZE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 pagesize = getpagesize();
Victor Stinner57766632020-10-29 15:16:23 +0100329#elif defined(HAVE_SYSCONF) && defined(_SC_PAGE_SIZE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 pagesize = sysconf(_SC_PAGE_SIZE);
Martin v. Löwis0cb3c632004-08-12 13:26:56 +0000331#else
Victor Stinner57766632020-10-29 15:16:23 +0100332# error "unsupported platform: resource.getpagesize()"
Martin v. Löwisf26d63b2003-03-30 17:23:49 +0000333#endif
Serhiy Storchaka19897632017-03-12 13:08:30 +0200334 return pagesize;
Guido van Rossum2e631391996-12-18 18:37:27 +0000335}
336
337/* List of functions */
338
339static struct PyMethodDef
340resource_methods[] = {
Serhiy Storchaka19897632017-03-12 13:08:30 +0200341 RESOURCE_GETRUSAGE_METHODDEF
342 RESOURCE_GETRLIMIT_METHODDEF
343 RESOURCE_PRLIMIT_METHODDEF
344 RESOURCE_SETRLIMIT_METHODDEF
345 RESOURCE_GETPAGESIZE_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 {NULL, NULL} /* sentinel */
Guido van Rossum2e631391996-12-18 18:37:27 +0000347};
348
349
350/* Module initialization */
351
Hai Shi45f70082020-04-02 20:35:08 +0800352static int
353resource_exec(PyObject *module)
Guido van Rossum2e631391996-12-18 18:37:27 +0000354{
Christian Heimes6d9ec8b2020-12-23 08:55:11 +0100355 resourcemodulestate *state = get_resource_state(module);
Hai Shi45f70082020-04-02 20:35:08 +0800356#define ADD_INT(module, value) \
357 do { \
358 if (PyModule_AddIntConstant(module, #value, value) < 0) { \
359 return -1; \
360 } \
361 } while (0)
Guido van Rossum2e631391996-12-18 18:37:27 +0000362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 /* Add some symbolic constants to the module */
Benjamin Peterson2122cf72011-12-10 17:50:22 -0500364 Py_INCREF(PyExc_OSError);
Hai Shi45f70082020-04-02 20:35:08 +0800365 if (PyModule_AddObject(module, "error", PyExc_OSError) < 0) {
366 Py_DECREF(PyExc_OSError);
367 return -1;
368 }
Victor Stinner1c8f0592013-07-22 22:24:54 +0200369
Christian Heimes6d9ec8b2020-12-23 08:55:11 +0100370 state->StructRUsageType = PyStructSequence_NewType(&struct_rusage_desc);
371 if (state->StructRUsageType == NULL) {
372 return -1;
373 }
374 if (PyModule_AddType(module, state->StructRUsageType) < 0) {
Hai Shi45f70082020-04-02 20:35:08 +0800375 return -1;
376 }
Guido van Rossum2e631391996-12-18 18:37:27 +0000377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 /* insert constants */
Guido van Rossum2e631391996-12-18 18:37:27 +0000379#ifdef RLIMIT_CPU
Hai Shi45f70082020-04-02 20:35:08 +0800380 ADD_INT(module, RLIMIT_CPU);
Guido van Rossum2e631391996-12-18 18:37:27 +0000381#endif
382
383#ifdef RLIMIT_FSIZE
Hai Shi45f70082020-04-02 20:35:08 +0800384 ADD_INT(module, RLIMIT_FSIZE);
Guido van Rossum2e631391996-12-18 18:37:27 +0000385#endif
386
387#ifdef RLIMIT_DATA
Hai Shi45f70082020-04-02 20:35:08 +0800388 ADD_INT(module, RLIMIT_DATA);
Guido van Rossum2e631391996-12-18 18:37:27 +0000389#endif
390
391#ifdef RLIMIT_STACK
Hai Shi45f70082020-04-02 20:35:08 +0800392 ADD_INT(module, RLIMIT_STACK);
Guido van Rossum2e631391996-12-18 18:37:27 +0000393#endif
394
395#ifdef RLIMIT_CORE
Hai Shi45f70082020-04-02 20:35:08 +0800396 ADD_INT(module, RLIMIT_CORE);
Guido van Rossum2e631391996-12-18 18:37:27 +0000397#endif
398
399#ifdef RLIMIT_NOFILE
Hai Shi45f70082020-04-02 20:35:08 +0800400 ADD_INT(module, RLIMIT_NOFILE);
Guido van Rossum2e631391996-12-18 18:37:27 +0000401#endif
402
403#ifdef RLIMIT_OFILE
Hai Shi45f70082020-04-02 20:35:08 +0800404 ADD_INT(module, RLIMIT_OFILE);
Guido van Rossum2e631391996-12-18 18:37:27 +0000405#endif
406
407#ifdef RLIMIT_VMEM
Hai Shi45f70082020-04-02 20:35:08 +0800408 ADD_INT(module, RLIMIT_VMEM);
Guido van Rossum2e631391996-12-18 18:37:27 +0000409#endif
410
411#ifdef RLIMIT_AS
Hai Shi45f70082020-04-02 20:35:08 +0800412 ADD_INT(module, RLIMIT_AS);
Guido van Rossum2e631391996-12-18 18:37:27 +0000413#endif
414
415#ifdef RLIMIT_RSS
Hai Shi45f70082020-04-02 20:35:08 +0800416 ADD_INT(module, RLIMIT_RSS);
Guido van Rossum2e631391996-12-18 18:37:27 +0000417#endif
418
419#ifdef RLIMIT_NPROC
Hai Shi45f70082020-04-02 20:35:08 +0800420 ADD_INT(module, RLIMIT_NPROC);
Guido van Rossum2e631391996-12-18 18:37:27 +0000421#endif
422
423#ifdef RLIMIT_MEMLOCK
Hai Shi45f70082020-04-02 20:35:08 +0800424 ADD_INT(module, RLIMIT_MEMLOCK);
Guido van Rossum2e631391996-12-18 18:37:27 +0000425#endif
426
Thomas Wouters89f507f2006-12-13 04:49:30 +0000427#ifdef RLIMIT_SBSIZE
Hai Shi45f70082020-04-02 20:35:08 +0800428 ADD_INT(module, RLIMIT_SBSIZE);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000429#endif
430
Christian Heimes6fc79bf2013-10-22 11:09:27 +0200431/* Linux specific */
432#ifdef RLIMIT_MSGQUEUE
Hai Shi45f70082020-04-02 20:35:08 +0800433 ADD_INT(module, RLIMIT_MSGQUEUE);
Christian Heimes6fc79bf2013-10-22 11:09:27 +0200434#endif
435
436#ifdef RLIMIT_NICE
Hai Shi45f70082020-04-02 20:35:08 +0800437 ADD_INT(module, RLIMIT_NICE);
Christian Heimes6fc79bf2013-10-22 11:09:27 +0200438#endif
439
440#ifdef RLIMIT_RTPRIO
Hai Shi45f70082020-04-02 20:35:08 +0800441 ADD_INT(module, RLIMIT_RTPRIO);
Christian Heimes6fc79bf2013-10-22 11:09:27 +0200442#endif
443
444#ifdef RLIMIT_RTTIME
Hai Shi45f70082020-04-02 20:35:08 +0800445 ADD_INT(module, RLIMIT_RTTIME);
Christian Heimes6fc79bf2013-10-22 11:09:27 +0200446#endif
447
448#ifdef RLIMIT_SIGPENDING
Hai Shi45f70082020-04-02 20:35:08 +0800449 ADD_INT(module, RLIMIT_SIGPENDING);
Christian Heimes6fc79bf2013-10-22 11:09:27 +0200450#endif
451
452/* target */
Guido van Rossum2e631391996-12-18 18:37:27 +0000453#ifdef RUSAGE_SELF
Hai Shi45f70082020-04-02 20:35:08 +0800454 ADD_INT(module, RUSAGE_SELF);
Guido van Rossum2e631391996-12-18 18:37:27 +0000455#endif
456
Guido van Rossumebd05eb1997-12-09 19:35:48 +0000457#ifdef RUSAGE_CHILDREN
Hai Shi45f70082020-04-02 20:35:08 +0800458 ADD_INT(module, RUSAGE_CHILDREN);
Guido van Rossum2e631391996-12-18 18:37:27 +0000459#endif
460
461#ifdef RUSAGE_BOTH
Hai Shi45f70082020-04-02 20:35:08 +0800462 ADD_INT(module, RUSAGE_BOTH);
Guido van Rossum2e631391996-12-18 18:37:27 +0000463#endif
Neil Schemenauer29ac3cb2002-03-24 22:27:39 +0000464
Antoine Pitroub6d4ee52010-11-17 16:19:35 +0000465#ifdef RUSAGE_THREAD
Hai Shi45f70082020-04-02 20:35:08 +0800466 ADD_INT(module, RUSAGE_THREAD);
Antoine Pitroub6d4ee52010-11-17 16:19:35 +0000467#endif
468
Christian Heimes5bb414d2013-12-08 14:35:55 +0100469/* FreeBSD specific */
470
471#ifdef RLIMIT_SWAP
Hai Shi45f70082020-04-02 20:35:08 +0800472 ADD_INT(module, RLIMIT_SWAP);
Christian Heimes5bb414d2013-12-08 14:35:55 +0100473#endif
474
475#ifdef RLIMIT_SBSIZE
Hai Shi45f70082020-04-02 20:35:08 +0800476 ADD_INT(module, RLIMIT_SBSIZE);
Christian Heimes5bb414d2013-12-08 14:35:55 +0100477#endif
478
479#ifdef RLIMIT_NPTS
Hai Shi45f70082020-04-02 20:35:08 +0800480 ADD_INT(module, RLIMIT_NPTS);
Christian Heimes5bb414d2013-12-08 14:35:55 +0100481#endif
482
David CARLIER7be00ee2021-02-18 15:26:20 +0000483#ifdef RLIMIT_KQUEUES
484 ADD_INT(module, RLIMIT_KQUEUES);
485#endif
486
Hai Shi45f70082020-04-02 20:35:08 +0800487 PyObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 if (sizeof(RLIM_INFINITY) > sizeof(long)) {
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700489 v = PyLong_FromLongLong((long long) RLIM_INFINITY);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 } else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 {
492 v = PyLong_FromLong((long) RLIM_INFINITY);
493 }
Hai Shi45f70082020-04-02 20:35:08 +0800494 if (!v) {
495 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 }
Hai Shi45f70082020-04-02 20:35:08 +0800497
498 if (PyModule_AddObject(module, "RLIM_INFINITY", v) < 0) {
499 Py_DECREF(v);
500 return -1;
501 }
Hai Shi45f70082020-04-02 20:35:08 +0800502 return 0;
503
504#undef ADD_INT
505}
506
507static struct PyModuleDef_Slot resource_slots[] = {
508 {Py_mod_exec, resource_exec},
509 {0, NULL}
510};
511
Christian Heimes6d9ec8b2020-12-23 08:55:11 +0100512static int
513resourcemodule_traverse(PyObject *m, visitproc visit, void *arg) {
514 Py_VISIT(get_resource_state(m)->StructRUsageType);
515 return 0;
516}
517
518static int
519resourcemodule_clear(PyObject *m) {
520 Py_CLEAR(get_resource_state(m)->StructRUsageType);
521 return 0;
522}
523
524static void
525resourcemodule_free(void *m) {
526 resourcemodule_clear((PyObject *)m);
527}
528
Hai Shi45f70082020-04-02 20:35:08 +0800529static struct PyModuleDef resourcemodule = {
530 PyModuleDef_HEAD_INIT,
531 .m_name = "resource",
Christian Heimes6d9ec8b2020-12-23 08:55:11 +0100532 .m_size = sizeof(resourcemodulestate),
Hai Shi45f70082020-04-02 20:35:08 +0800533 .m_methods = resource_methods,
534 .m_slots = resource_slots,
Christian Heimes6d9ec8b2020-12-23 08:55:11 +0100535 .m_traverse = resourcemodule_traverse,
536 .m_clear = resourcemodule_clear,
537 .m_free = resourcemodule_free,
Hai Shi45f70082020-04-02 20:35:08 +0800538};
539
540PyMODINIT_FUNC
541PyInit_resource(void)
542{
543 return PyModuleDef_Init(&resourcemodule);
Guido van Rossum2e631391996-12-18 18:37:27 +0000544}