11
22#include "Python.h"
3+ #include "structseq.h"
34#include <sys/resource.h>
45#include <sys/time.h>
56#include <string.h>
1617
1718static PyObject * ResourceError ;
1819
20+ static char struct_rusage__doc__ [] =
21+ "struct_rusage: Result from getrusage.\n\n"
22+ "This object may be accessed either as a tuple of\n"
23+ " (utime,stime,maxrss,ixrss,idrss,isrss,minflt,majflt,\n"
24+ " nswap,inblock,oublock,msgsnd,msgrcv,nsignals,nvcsw,nivcsw)\n"
25+ "or via the attributes ru_utime, ru_stime, ru_maxrss, and so on.\n" ;
26+
27+ static PyStructSequence_Field struct_rusage_fields [] = {
28+ {"ru_utime" , "user time used" },
29+ {"ru_stime" , "system time used" },
30+ {"ru_maxrss" , "max. resident set size" },
31+ {"ru_ixrss" , "shared memory size" },
32+ {"ru_idrss" , "unshared data size" },
33+ {"ru_isrss" , "unshared stack size" },
34+ {"ru_minflt" , "page faults not requiring I/O" },
35+ {"ru_majflt" , "page faults requiring I/O" },
36+ {"ru_nswap" , "number of swap outs" },
37+ {"ru_inblock" , "block input operations" },
38+ {"ru_oublock" , "block output operations" },
39+ {"ru_msgsnd" , "IPC messages sent" },
40+ {"ru_msgrcv" , "IPC messages received" },
41+ {"ru_nsignals" , "signals received" },
42+ {"ru_nvcsw" , "voluntary context switches" },
43+ {"ru_nivcsw" , "involuntary context switches" },
44+ {0 }
45+ };
46+
47+ static PyStructSequence_Desc struct_rusage_desc = {
48+ "resource.struct_rusage" , /* name */
49+ struct_rusage__doc__ , /* doc */
50+ struct_rusage_fields , /* fields */
51+ 16 /* n_in_sequence */
52+ };
53+
54+ static PyTypeObject StructRUsageType ;
55+
1956static PyObject *
2057resource_getrusage (PyObject * self , PyObject * args )
2158{
2259 int who ;
2360 struct rusage ru ;
61+ PyObject * result ;
2462
2563 if (!PyArg_ParseTuple (args , "i:getrusage" , & who ))
2664 return NULL ;
@@ -35,29 +73,35 @@ resource_getrusage(PyObject *self, PyObject *args)
3573 return NULL ;
3674 }
3775
38- /* Yeah, this 16-tuple is way ugly. It's probably a lot less
39- ugly than a dictionary with keys (or object attributes)
40- named things like 'ixrss'.
41- */
42- return Py_BuildValue (
43- "ddiiiiiiiiiiiiii" ,
44- doubletime (ru .ru_utime ), /* user time used */
45- doubletime (ru .ru_stime ), /* system time used */
46- ru .ru_maxrss , /* max. resident set size */
47- ru .ru_ixrss , /* shared memory size */
48- ru .ru_idrss , /* unshared memory size */
49- ru .ru_isrss , /* unshared stack size */
50- ru .ru_minflt , /* page faults not requiring I/O*/
51- ru .ru_majflt , /* page faults requiring I/O */
52- ru .ru_nswap , /* number of swap outs */
53- ru .ru_inblock , /* block input operations */
54- ru .ru_oublock , /* block output operations */
55- ru .ru_msgsnd , /* messages sent */
56- ru .ru_msgrcv , /* messages received */
57- ru .ru_nsignals , /* signals received */
58- ru .ru_nvcsw , /* voluntary context switches */
59- ru .ru_nivcsw /* involuntary context switches */
60- );
76+ result = PyStructSequence_New (& StructRUsageType );
77+ if (!result )
78+ return NULL ;
79+
80+ PyStructSequence_SET_ITEM (result , 0 ,
81+ PyFloat_FromDouble (doubletime (ru .ru_utime )));
82+ PyStructSequence_SET_ITEM (result , 1 ,
83+ PyFloat_FromDouble (doubletime (ru .ru_stime )));
84+ PyStructSequence_SET_ITEM (result , 2 , PyInt_FromLong (ru .ru_maxrss ));
85+ PyStructSequence_SET_ITEM (result , 3 , PyInt_FromLong (ru .ru_ixrss ));
86+ PyStructSequence_SET_ITEM (result , 4 , PyInt_FromLong (ru .ru_idrss ));
87+ PyStructSequence_SET_ITEM (result , 5 , PyInt_FromLong (ru .ru_isrss ));
88+ PyStructSequence_SET_ITEM (result , 6 , PyInt_FromLong (ru .ru_minflt ));
89+ PyStructSequence_SET_ITEM (result , 7 , PyInt_FromLong (ru .ru_majflt ));
90+ PyStructSequence_SET_ITEM (result , 8 , PyInt_FromLong (ru .ru_nswap ));
91+ PyStructSequence_SET_ITEM (result , 9 , PyInt_FromLong (ru .ru_inblock ));
92+ PyStructSequence_SET_ITEM (result , 10 , PyInt_FromLong (ru .ru_oublock ));
93+ PyStructSequence_SET_ITEM (result , 11 , PyInt_FromLong (ru .ru_msgsnd ));
94+ PyStructSequence_SET_ITEM (result , 12 , PyInt_FromLong (ru .ru_msgrcv ));
95+ PyStructSequence_SET_ITEM (result , 13 , PyInt_FromLong (ru .ru_nsignals ));
96+ PyStructSequence_SET_ITEM (result , 14 , PyInt_FromLong (ru .ru_nvcsw ));
97+ PyStructSequence_SET_ITEM (result , 15 , PyInt_FromLong (ru .ru_nivcsw ));
98+
99+ if (PyErr_Occurred ()) {
100+ Py_DECREF (result );
101+ return NULL ;
102+ }
103+
104+ return result ;
61105}
62106
63107
@@ -172,6 +216,9 @@ initresource(void)
172216 }
173217 Py_INCREF (ResourceError );
174218 PyModule_AddObject (m , "error" , ResourceError );
219+ PyStructSequence_InitType (& StructRUsageType , & struct_rusage_desc );
220+ PyModule_AddObject (m , "struct_rusage" ,
221+ (PyObject * ) & StructRUsageType );
175222
176223 /* insert constants */
177224#ifdef RLIMIT_CPU
0 commit comments