| Guido van Rossum | f84a539 | 1997-08-15 00:04:24 +0000 | [diff] [blame] | 1 |  | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 2 | #include "Python.h" | 
 | 3 | #include <sys/resource.h> | 
 | 4 | #include <sys/time.h> | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 5 | #include <string.h> | 
 | 6 | #include <errno.h> | 
| Martin v. Löwis | f26d63b | 2003-03-30 17:23:49 +0000 | [diff] [blame] | 7 | /* for sysconf */ | 
 | 8 | #if defined(HAVE_UNISTD_H) | 
 | 9 | #include <unistd.h> | 
 | 10 | #endif | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 11 |  | 
| Guido van Rossum | 607b33a | 1997-08-17 16:24:30 +0000 | [diff] [blame] | 12 | /* 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 Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 18 |  | 
 | 19 | #define doubletime(TV) ((double)(TV).tv_sec + (TV).tv_usec * 0.000001) | 
 | 20 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 21 | PyDoc_STRVAR(struct_rusage__doc__, | 
 | 22 | "struct_rusage: Result from getrusage.\n\n" | 
 | 23 | "This object may be accessed either as a tuple of\n" | 
 | 24 | "    (utime,stime,maxrss,ixrss,idrss,isrss,minflt,majflt,\n" | 
 | 25 | "    nswap,inblock,oublock,msgsnd,msgrcv,nsignals,nvcsw,nivcsw)\n" | 
 | 26 | "or via the attributes ru_utime, ru_stime, ru_maxrss, and so on."); | 
| Martin v. Löwis | 688357e | 2002-04-08 21:28:20 +0000 | [diff] [blame] | 27 |  | 
 | 28 | static PyStructSequence_Field struct_rusage_fields[] = { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 29 |     {"ru_utime",        "user time used"}, | 
 | 30 |     {"ru_stime",        "system time used"}, | 
 | 31 |     {"ru_maxrss",       "max. resident set size"}, | 
 | 32 |     {"ru_ixrss",        "shared memory size"}, | 
 | 33 |     {"ru_idrss",        "unshared data size"}, | 
 | 34 |     {"ru_isrss",        "unshared stack size"}, | 
 | 35 |     {"ru_minflt",       "page faults not requiring I/O"}, | 
 | 36 |     {"ru_majflt",       "page faults requiring I/O"}, | 
 | 37 |     {"ru_nswap",        "number of swap outs"}, | 
 | 38 |     {"ru_inblock",      "block input operations"}, | 
 | 39 |     {"ru_oublock",      "block output operations"}, | 
 | 40 |     {"ru_msgsnd",       "IPC messages sent"}, | 
 | 41 |     {"ru_msgrcv",       "IPC messages received"}, | 
 | 42 |     {"ru_nsignals",     "signals received"}, | 
 | 43 |     {"ru_nvcsw",        "voluntary context switches"}, | 
 | 44 |     {"ru_nivcsw",       "involuntary context switches"}, | 
 | 45 |     {0} | 
| Martin v. Löwis | 688357e | 2002-04-08 21:28:20 +0000 | [diff] [blame] | 46 | }; | 
 | 47 |  | 
 | 48 | static PyStructSequence_Desc struct_rusage_desc = { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 49 |     "resource.struct_rusage",           /* name */ | 
 | 50 |     struct_rusage__doc__,       /* doc */ | 
 | 51 |     struct_rusage_fields,       /* fields */ | 
 | 52 |     16          /* n_in_sequence */ | 
| Martin v. Löwis | 688357e | 2002-04-08 21:28:20 +0000 | [diff] [blame] | 53 | }; | 
 | 54 |  | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 55 | static int initialized; | 
| Martin v. Löwis | 688357e | 2002-04-08 21:28:20 +0000 | [diff] [blame] | 56 | static PyTypeObject StructRUsageType; | 
 | 57 |  | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 58 | static PyObject * | 
| Peter Schneider-Kamp | 416d413 | 2000-07-10 12:15:54 +0000 | [diff] [blame] | 59 | resource_getrusage(PyObject *self, PyObject *args) | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 60 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 61 |     int who; | 
 | 62 |     struct rusage ru; | 
 | 63 |     PyObject *result; | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 64 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 65 |     if (!PyArg_ParseTuple(args, "i:getrusage", &who)) | 
 | 66 |         return NULL; | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 67 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 68 |     if (getrusage(who, &ru) == -1) { | 
 | 69 |         if (errno == EINVAL) { | 
 | 70 |             PyErr_SetString(PyExc_ValueError, | 
 | 71 |                             "invalid who parameter"); | 
 | 72 |             return NULL; | 
 | 73 |         } | 
| Benjamin Peterson | 2122cf7 | 2011-12-10 17:50:22 -0500 | [diff] [blame] | 74 |         PyErr_SetFromErrno(PyExc_OSError); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 75 |         return NULL; | 
 | 76 |     } | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 77 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 78 |     result = PyStructSequence_New(&StructRUsageType); | 
 | 79 |     if (!result) | 
 | 80 |         return NULL; | 
| Martin v. Löwis | 688357e | 2002-04-08 21:28:20 +0000 | [diff] [blame] | 81 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 82 |     PyStructSequence_SET_ITEM(result, 0, | 
 | 83 |                     PyFloat_FromDouble(doubletime(ru.ru_utime))); | 
 | 84 |     PyStructSequence_SET_ITEM(result, 1, | 
 | 85 |                     PyFloat_FromDouble(doubletime(ru.ru_stime))); | 
 | 86 |     PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong(ru.ru_maxrss)); | 
 | 87 |     PyStructSequence_SET_ITEM(result, 3, PyLong_FromLong(ru.ru_ixrss)); | 
 | 88 |     PyStructSequence_SET_ITEM(result, 4, PyLong_FromLong(ru.ru_idrss)); | 
 | 89 |     PyStructSequence_SET_ITEM(result, 5, PyLong_FromLong(ru.ru_isrss)); | 
 | 90 |     PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(ru.ru_minflt)); | 
 | 91 |     PyStructSequence_SET_ITEM(result, 7, PyLong_FromLong(ru.ru_majflt)); | 
 | 92 |     PyStructSequence_SET_ITEM(result, 8, PyLong_FromLong(ru.ru_nswap)); | 
 | 93 |     PyStructSequence_SET_ITEM(result, 9, PyLong_FromLong(ru.ru_inblock)); | 
 | 94 |     PyStructSequence_SET_ITEM(result, 10, PyLong_FromLong(ru.ru_oublock)); | 
 | 95 |     PyStructSequence_SET_ITEM(result, 11, PyLong_FromLong(ru.ru_msgsnd)); | 
 | 96 |     PyStructSequence_SET_ITEM(result, 12, PyLong_FromLong(ru.ru_msgrcv)); | 
 | 97 |     PyStructSequence_SET_ITEM(result, 13, PyLong_FromLong(ru.ru_nsignals)); | 
 | 98 |     PyStructSequence_SET_ITEM(result, 14, PyLong_FromLong(ru.ru_nvcsw)); | 
 | 99 |     PyStructSequence_SET_ITEM(result, 15, PyLong_FromLong(ru.ru_nivcsw)); | 
| Martin v. Löwis | 688357e | 2002-04-08 21:28:20 +0000 | [diff] [blame] | 100 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 101 |     if (PyErr_Occurred()) { | 
 | 102 |         Py_DECREF(result); | 
 | 103 |         return NULL; | 
 | 104 |     } | 
| Martin v. Löwis | 688357e | 2002-04-08 21:28:20 +0000 | [diff] [blame] | 105 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 106 |     return result; | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 107 | } | 
 | 108 |  | 
 | 109 |  | 
 | 110 | static PyObject * | 
| Peter Schneider-Kamp | 416d413 | 2000-07-10 12:15:54 +0000 | [diff] [blame] | 111 | resource_getrlimit(PyObject *self, PyObject *args) | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 112 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 113 |     struct rlimit rl; | 
 | 114 |     int resource; | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 115 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 116 |     if (!PyArg_ParseTuple(args, "i:getrlimit", &resource)) | 
 | 117 |         return NULL; | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 118 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 119 |     if (resource < 0 || resource >= RLIM_NLIMITS) { | 
 | 120 |         PyErr_SetString(PyExc_ValueError, | 
 | 121 |                         "invalid resource specified"); | 
 | 122 |         return NULL; | 
 | 123 |     } | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 124 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 125 |     if (getrlimit(resource, &rl) == -1) { | 
| Benjamin Peterson | 2122cf7 | 2011-12-10 17:50:22 -0500 | [diff] [blame] | 126 |         PyErr_SetFromErrno(PyExc_OSError); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 127 |         return NULL; | 
 | 128 |     } | 
| Guido van Rossum | 763737b | 1999-01-06 18:44:57 +0000 | [diff] [blame] | 129 |  | 
 | 130 | #if defined(HAVE_LONG_LONG) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 131 |     if (sizeof(rl.rlim_cur) > sizeof(long)) { | 
 | 132 |         return Py_BuildValue("LL", | 
 | 133 |                              (PY_LONG_LONG) rl.rlim_cur, | 
 | 134 |                              (PY_LONG_LONG) rl.rlim_max); | 
 | 135 |     } | 
| Guido van Rossum | 763737b | 1999-01-06 18:44:57 +0000 | [diff] [blame] | 136 | #endif | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 137 |     return Py_BuildValue("ll", (long) rl.rlim_cur, (long) rl.rlim_max); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 138 | } | 
 | 139 |  | 
 | 140 | static PyObject * | 
| Peter Schneider-Kamp | 416d413 | 2000-07-10 12:15:54 +0000 | [diff] [blame] | 141 | resource_setrlimit(PyObject *self, PyObject *args) | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 142 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 143 |     struct rlimit rl; | 
 | 144 |     int resource; | 
| Serhiy Storchaka | 19c4e0d | 2013-02-04 12:47:24 +0200 | [diff] [blame] | 145 |     PyObject *limits, *curobj, *maxobj; | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 146 |  | 
| Serhiy Storchaka | 19c4e0d | 2013-02-04 12:47:24 +0200 | [diff] [blame] | 147 |     if (!PyArg_ParseTuple(args, "iO:setrlimit", &resource, &limits)) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 148 |         return NULL; | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 149 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 150 |     if (resource < 0 || resource >= RLIM_NLIMITS) { | 
 | 151 |         PyErr_SetString(PyExc_ValueError, | 
 | 152 |                         "invalid resource specified"); | 
 | 153 |         return NULL; | 
 | 154 |     } | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 155 |  | 
| Serhiy Storchaka | 19c4e0d | 2013-02-04 12:47:24 +0200 | [diff] [blame] | 156 |     limits = PySequence_Tuple(limits); | 
 | 157 |     if (!limits) | 
 | 158 |         /* Here limits is a borrowed reference */ | 
 | 159 |         return NULL; | 
 | 160 |  | 
 | 161 |     if (PyTuple_GET_SIZE(limits) != 2) { | 
 | 162 |         PyErr_SetString(PyExc_ValueError, | 
 | 163 |                         "expected a tuple of 2 integers"); | 
 | 164 |         goto error; | 
 | 165 |     } | 
 | 166 |     curobj = PyTuple_GET_ITEM(limits, 0); | 
 | 167 |     maxobj = PyTuple_GET_ITEM(limits, 1); | 
 | 168 |  | 
| Guido van Rossum | 763737b | 1999-01-06 18:44:57 +0000 | [diff] [blame] | 169 | #if !defined(HAVE_LARGEFILE_SUPPORT) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 170 |     rl.rlim_cur = PyLong_AsLong(curobj); | 
 | 171 |     if (rl.rlim_cur == (rlim_t)-1 && PyErr_Occurred()) | 
| Serhiy Storchaka | 19c4e0d | 2013-02-04 12:47:24 +0200 | [diff] [blame] | 172 |         goto error; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 173 |     rl.rlim_max = PyLong_AsLong(maxobj); | 
 | 174 |     if (rl.rlim_max == (rlim_t)-1 && PyErr_Occurred()) | 
| Serhiy Storchaka | 19c4e0d | 2013-02-04 12:47:24 +0200 | [diff] [blame] | 175 |         goto error; | 
| Guido van Rossum | 763737b | 1999-01-06 18:44:57 +0000 | [diff] [blame] | 176 | #else | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 177 |     /* The limits are probably bigger than a long */ | 
 | 178 |     rl.rlim_cur = PyLong_AsLongLong(curobj); | 
 | 179 |     if (rl.rlim_cur == (rlim_t)-1 && PyErr_Occurred()) | 
| Serhiy Storchaka | 19c4e0d | 2013-02-04 12:47:24 +0200 | [diff] [blame] | 180 |         goto error; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 181 |     rl.rlim_max = PyLong_AsLongLong(maxobj); | 
 | 182 |     if (rl.rlim_max == (rlim_t)-1 && PyErr_Occurred()) | 
| Serhiy Storchaka | 19c4e0d | 2013-02-04 12:47:24 +0200 | [diff] [blame] | 183 |         goto error; | 
| Guido van Rossum | 763737b | 1999-01-06 18:44:57 +0000 | [diff] [blame] | 184 | #endif | 
 | 185 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 186 |     rl.rlim_cur = rl.rlim_cur & RLIM_INFINITY; | 
 | 187 |     rl.rlim_max = rl.rlim_max & RLIM_INFINITY; | 
 | 188 |     if (setrlimit(resource, &rl) == -1) { | 
 | 189 |         if (errno == EINVAL) | 
 | 190 |             PyErr_SetString(PyExc_ValueError, | 
 | 191 |                             "current limit exceeds maximum limit"); | 
 | 192 |         else if (errno == EPERM) | 
 | 193 |             PyErr_SetString(PyExc_ValueError, | 
 | 194 |                             "not allowed to raise maximum limit"); | 
 | 195 |         else | 
| Benjamin Peterson | 2122cf7 | 2011-12-10 17:50:22 -0500 | [diff] [blame] | 196 |             PyErr_SetFromErrno(PyExc_OSError); | 
| Serhiy Storchaka | 19c4e0d | 2013-02-04 12:47:24 +0200 | [diff] [blame] | 197 |         goto error; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 198 |     } | 
| Serhiy Storchaka | 19c4e0d | 2013-02-04 12:47:24 +0200 | [diff] [blame] | 199 |     Py_DECREF(limits); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 200 |     Py_INCREF(Py_None); | 
 | 201 |     return Py_None; | 
| Serhiy Storchaka | 19c4e0d | 2013-02-04 12:47:24 +0200 | [diff] [blame] | 202 |  | 
 | 203 |   error: | 
 | 204 |     Py_DECREF(limits); | 
 | 205 |     return NULL; | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 206 | } | 
 | 207 |  | 
 | 208 | static PyObject * | 
| Thomas Wouters | 4d70c3d | 2006-06-08 14:42:34 +0000 | [diff] [blame] | 209 | resource_getpagesize(PyObject *self, PyObject *unused) | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 210 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 211 |     long pagesize = 0; | 
| Martin v. Löwis | f26d63b | 2003-03-30 17:23:49 +0000 | [diff] [blame] | 212 | #if defined(HAVE_GETPAGESIZE) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 213 |     pagesize = getpagesize(); | 
| Martin v. Löwis | f26d63b | 2003-03-30 17:23:49 +0000 | [diff] [blame] | 214 | #elif defined(HAVE_SYSCONF) | 
| Martin v. Löwis | 0cb3c63 | 2004-08-12 13:26:56 +0000 | [diff] [blame] | 215 | #if defined(_SC_PAGE_SIZE) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 216 |     pagesize = sysconf(_SC_PAGE_SIZE); | 
| Martin v. Löwis | 0cb3c63 | 2004-08-12 13:26:56 +0000 | [diff] [blame] | 217 | #else | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 218 |     /* Irix 5.3 has _SC_PAGESIZE, but not _SC_PAGE_SIZE */ | 
 | 219 |     pagesize = sysconf(_SC_PAGESIZE); | 
| Martin v. Löwis | 0cb3c63 | 2004-08-12 13:26:56 +0000 | [diff] [blame] | 220 | #endif | 
| Martin v. Löwis | f26d63b | 2003-03-30 17:23:49 +0000 | [diff] [blame] | 221 | #endif | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 222 |     return Py_BuildValue("i", pagesize); | 
| Martin v. Löwis | f26d63b | 2003-03-30 17:23:49 +0000 | [diff] [blame] | 223 |  | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 224 | } | 
 | 225 |  | 
 | 226 | /* List of functions */ | 
 | 227 |  | 
 | 228 | static struct PyMethodDef | 
 | 229 | resource_methods[] = { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 230 |     {"getrusage",    resource_getrusage,   METH_VARARGS}, | 
 | 231 |     {"getrlimit",    resource_getrlimit,   METH_VARARGS}, | 
 | 232 |     {"setrlimit",    resource_setrlimit,   METH_VARARGS}, | 
 | 233 |     {"getpagesize",  resource_getpagesize, METH_NOARGS}, | 
 | 234 |     {NULL, NULL}                             /* sentinel */ | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 235 | }; | 
 | 236 |  | 
 | 237 |  | 
 | 238 | /* Module initialization */ | 
 | 239 |  | 
| Martin v. Löwis | 1a21451 | 2008-06-11 05:26:20 +0000 | [diff] [blame] | 240 |  | 
 | 241 | static struct PyModuleDef resourcemodule = { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 242 |     PyModuleDef_HEAD_INIT, | 
 | 243 |     "resource", | 
 | 244 |     NULL, | 
 | 245 |     -1, | 
 | 246 |     resource_methods, | 
 | 247 |     NULL, | 
 | 248 |     NULL, | 
 | 249 |     NULL, | 
 | 250 |     NULL | 
| Martin v. Löwis | 1a21451 | 2008-06-11 05:26:20 +0000 | [diff] [blame] | 251 | }; | 
 | 252 |  | 
| Mark Hammond | fe51c6d | 2002-08-02 02:27:13 +0000 | [diff] [blame] | 253 | PyMODINIT_FUNC | 
| Martin v. Löwis | 1a21451 | 2008-06-11 05:26:20 +0000 | [diff] [blame] | 254 | PyInit_resource(void) | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 255 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 256 |     PyObject *m, *v; | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 257 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 258 |     /* Create the module and add the functions */ | 
 | 259 |     m = PyModule_Create(&resourcemodule); | 
 | 260 |     if (m == NULL) | 
 | 261 |         return NULL; | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 262 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 263 |     /* Add some symbolic constants to the module */ | 
| Benjamin Peterson | 2122cf7 | 2011-12-10 17:50:22 -0500 | [diff] [blame] | 264 |     Py_INCREF(PyExc_OSError); | 
 | 265 |     PyModule_AddObject(m, "error", PyExc_OSError); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 266 |     if (!initialized) | 
 | 267 |         PyStructSequence_InitType(&StructRUsageType, | 
 | 268 |                                   &struct_rusage_desc); | 
 | 269 |     Py_INCREF(&StructRUsageType); | 
 | 270 |     PyModule_AddObject(m, "struct_rusage", | 
 | 271 |                        (PyObject*) &StructRUsageType); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 272 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 273 |     /* insert constants */ | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 274 | #ifdef RLIMIT_CPU | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 275 |     PyModule_AddIntMacro(m, RLIMIT_CPU); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 276 | #endif | 
 | 277 |  | 
 | 278 | #ifdef RLIMIT_FSIZE | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 279 |     PyModule_AddIntMacro(m, RLIMIT_FSIZE); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 280 | #endif | 
 | 281 |  | 
 | 282 | #ifdef RLIMIT_DATA | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 283 |     PyModule_AddIntMacro(m, RLIMIT_DATA); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 284 | #endif | 
 | 285 |  | 
 | 286 | #ifdef RLIMIT_STACK | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 287 |     PyModule_AddIntMacro(m, RLIMIT_STACK); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 288 | #endif | 
 | 289 |  | 
 | 290 | #ifdef RLIMIT_CORE | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 291 |     PyModule_AddIntMacro(m, RLIMIT_CORE); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 292 | #endif | 
 | 293 |  | 
 | 294 | #ifdef RLIMIT_NOFILE | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 295 |     PyModule_AddIntMacro(m, RLIMIT_NOFILE); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 296 | #endif | 
 | 297 |  | 
 | 298 | #ifdef RLIMIT_OFILE | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 299 |     PyModule_AddIntMacro(m, RLIMIT_OFILE); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 300 | #endif | 
 | 301 |  | 
 | 302 | #ifdef RLIMIT_VMEM | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 303 |     PyModule_AddIntMacro(m, RLIMIT_VMEM); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 304 | #endif | 
 | 305 |  | 
 | 306 | #ifdef RLIMIT_AS | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 307 |     PyModule_AddIntMacro(m, RLIMIT_AS); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 308 | #endif | 
 | 309 |  | 
 | 310 | #ifdef RLIMIT_RSS | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 311 |     PyModule_AddIntMacro(m, RLIMIT_RSS); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 312 | #endif | 
 | 313 |  | 
 | 314 | #ifdef RLIMIT_NPROC | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 315 |     PyModule_AddIntMacro(m, RLIMIT_NPROC); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 316 | #endif | 
 | 317 |  | 
 | 318 | #ifdef RLIMIT_MEMLOCK | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 319 |     PyModule_AddIntMacro(m, RLIMIT_MEMLOCK); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 320 | #endif | 
 | 321 |  | 
| Thomas Wouters | 89f507f | 2006-12-13 04:49:30 +0000 | [diff] [blame] | 322 | #ifdef RLIMIT_SBSIZE | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 323 |     PyModule_AddIntMacro(m, RLIMIT_SBSIZE); | 
| Thomas Wouters | 89f507f | 2006-12-13 04:49:30 +0000 | [diff] [blame] | 324 | #endif | 
 | 325 |  | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 326 | #ifdef RUSAGE_SELF | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 327 |     PyModule_AddIntMacro(m, RUSAGE_SELF); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 328 | #endif | 
 | 329 |  | 
| Guido van Rossum | ebd05eb | 1997-12-09 19:35:48 +0000 | [diff] [blame] | 330 | #ifdef RUSAGE_CHILDREN | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 331 |     PyModule_AddIntMacro(m, RUSAGE_CHILDREN); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 332 | #endif | 
 | 333 |  | 
 | 334 | #ifdef RUSAGE_BOTH | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 335 |     PyModule_AddIntMacro(m, RUSAGE_BOTH); | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 336 | #endif | 
| Neil Schemenauer | 29ac3cb | 2002-03-24 22:27:39 +0000 | [diff] [blame] | 337 |  | 
| Antoine Pitrou | b6d4ee5 | 2010-11-17 16:19:35 +0000 | [diff] [blame] | 338 | #ifdef RUSAGE_THREAD | 
| Charles-Francois Natali | 74ca886 | 2013-05-20 19:13:19 +0200 | [diff] [blame] | 339 |     PyModule_AddIntMacro(m, RUSAGE_THREAD); | 
| Antoine Pitrou | b6d4ee5 | 2010-11-17 16:19:35 +0000 | [diff] [blame] | 340 | #endif | 
 | 341 |  | 
| Neil Schemenauer | 29ac3cb | 2002-03-24 22:27:39 +0000 | [diff] [blame] | 342 | #if defined(HAVE_LONG_LONG) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 343 |     if (sizeof(RLIM_INFINITY) > sizeof(long)) { | 
 | 344 |         v = PyLong_FromLongLong((PY_LONG_LONG) RLIM_INFINITY); | 
 | 345 |     } else | 
| Neil Schemenauer | 29ac3cb | 2002-03-24 22:27:39 +0000 | [diff] [blame] | 346 | #endif | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 347 |     { | 
 | 348 |         v = PyLong_FromLong((long) RLIM_INFINITY); | 
 | 349 |     } | 
 | 350 |     if (v) { | 
 | 351 |         PyModule_AddObject(m, "RLIM_INFINITY", v); | 
 | 352 |     } | 
 | 353 |     initialized = 1; | 
 | 354 |     return m; | 
| Guido van Rossum | 2e63139 | 1996-12-18 18:37:27 +0000 | [diff] [blame] | 355 | } |