GNU Octave  4.0.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
getrusage.cc
Go to the documentation of this file.
1 /*
2 
3 Copyright (C) 1996-2015 John W. Eaton
4 
5 This file is part of Octave.
6 
7 Octave is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
11 
12 Octave is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with Octave; see the file COPYING. If not, see
19 <http://www.gnu.org/licenses/>.
20 
21 */
22 
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
26 
27 #include <sys/time.h>
28 #include <sys/times.h>
29 #include <sys/types.h>
30 
31 #ifdef HAVE_SYS_RESOURCE_H
32 #include <sys/resource.h>
33 #endif
34 
35 #if defined (HAVE_SYS_PARAM_H)
36 #include <sys/param.h>
37 #endif
38 
39 #include "defun.h"
40 #include "oct-map.h"
41 #include "sysdep.h"
42 #include "ov.h"
43 #include "oct-obj.h"
44 #include "utils.h"
45 
46 #if !defined (HZ)
47 #if defined (CLK_TCK)
48 #define HZ CLK_TCK
49 #elif defined (USG)
50 #define HZ 100
51 #else
52 #define HZ 60
53 #endif
54 #endif
55 
56 #ifndef RUSAGE_SELF
57 #define RUSAGE_SELF 0
58 #endif
59 
60 // System resource functions.
61 
62 DEFUN (getrusage, , ,
63  "-*- texinfo -*-\n\
64 @deftypefn {Built-in Function} {} getrusage ()\n\
65 Return a structure containing a number of statistics about the current\n\
66 Octave process.\n\
67 \n\
68 Not all fields are available on all systems. If it is not possible to get\n\
69 CPU time statistics, the CPU time slots are set to zero. Other missing data\n\
70 are replaced by NaN@. The list of possible fields is:\n\
71 \n\
72 @table @code\n\
73 @item idrss\n\
74 Unshared data size.\n\
75 \n\
76 @item inblock\n\
77 Number of block input operations.\n\
78 \n\
79 @item isrss\n\
80 Unshared stack size.\n\
81 \n\
82 @item ixrss\n\
83 Shared memory size.\n\
84 \n\
85 @item majflt\n\
86 Number of major page faults.\n\
87 \n\
88 @item maxrss\n\
89 Maximum data size.\n\
90 \n\
91 @item minflt\n\
92 Number of minor page faults.\n\
93 \n\
94 @item msgrcv\n\
95 Number of messages received.\n\
96 \n\
97 @item msgsnd\n\
98 Number of messages sent.\n\
99 \n\
100 @item nivcsw\n\
101 Number of involuntary context switches.\n\
102 \n\
103 @item nsignals\n\
104 Number of signals received.\n\
105 \n\
106 @item nswap\n\
107 Number of swaps.\n\
108 \n\
109 @item nvcsw\n\
110 Number of voluntary context switches.\n\
111 \n\
112 @item oublock\n\
113 Number of block output operations.\n\
114 \n\
115 @item stime\n\
116 A structure containing the system CPU time used. The structure has the\n\
117 elements @code{sec} (seconds) @code{usec} (microseconds).\n\
118 \n\
119 @item utime\n\
120 A structure containing the user CPU time used. The structure has the\n\
121 elements @code{sec} (seconds) @code{usec} (microseconds).\n\
122 @end table\n\
123 @end deftypefn")
124 {
126  octave_scalar_map tv_tmp;
127 
128  // FIXME: maybe encapsulate all of this in a liboctave class
129 #if defined (HAVE_GETRUSAGE)
130 
131  struct rusage ru;
132 
133  getrusage (RUSAGE_SELF, &ru);
134 
135  tv_tmp.assign ("sec", static_cast<double> (ru.ru_utime.tv_sec));
136  tv_tmp.assign ("usec", static_cast<double> (ru.ru_utime.tv_usec));
137  m.assign ("utime", octave_value (tv_tmp));
138 
139  tv_tmp.assign ("sec", static_cast<double> (ru.ru_stime.tv_sec));
140  tv_tmp.assign ("usec", static_cast<double> (ru.ru_stime.tv_usec));
141  m.assign ("stime", octave_value (tv_tmp));
142 
143 #if ! defined (RUSAGE_TIMES_ONLY)
144  m.assign ("maxrss", static_cast<double> (ru.ru_maxrss));
145  m.assign ("ixrss", static_cast<double> (ru.ru_ixrss));
146  m.assign ("idrss", static_cast<double> (ru.ru_idrss));
147  m.assign ("isrss", static_cast<double> (ru.ru_isrss));
148  m.assign ("minflt", static_cast<double> (ru.ru_minflt));
149  m.assign ("majflt", static_cast<double> (ru.ru_majflt));
150  m.assign ("nswap", static_cast<double> (ru.ru_nswap));
151  m.assign ("inblock", static_cast<double> (ru.ru_inblock));
152  m.assign ("oublock", static_cast<double> (ru.ru_oublock));
153  m.assign ("msgsnd", static_cast<double> (ru.ru_msgsnd));
154  m.assign ("msgrcv", static_cast<double> (ru.ru_msgrcv));
155  m.assign ("nsignals", static_cast<double> (ru.ru_nsignals));
156  m.assign ("nvcsw", static_cast<double> (ru.ru_nvcsw));
157  m.assign ("nivcsw", static_cast<double> (ru.ru_nivcsw));
158 #endif
159 
160 #else
161 
162  struct tms t;
163 
164  times (&t);
165 
166  unsigned long ticks;
167  unsigned long seconds;
168  unsigned long fraction;
169 
170  ticks = t.tms_utime + t.tms_cutime;
171  fraction = ticks % HZ;
172  seconds = ticks / HZ;
173 
174  tv_tmp.assign ("sec", static_cast<double> (seconds));
175  tv_tmp.assign ("usec", static_cast<double> (fraction * 1e6 / HZ));
176  m.assign ("utime", octave_value (tv_tmp));
177 
178  ticks = t.tms_stime + t.tms_cstime;
179  fraction = ticks % HZ;
180  seconds = ticks / HZ;
181 
182  tv_tmp.assign ("sec", static_cast<double> (seconds));
183  tv_tmp.assign ("usec", static_cast<double> (fraction * 1e6 / HZ));
184  m.assign ("stime", octave_value (tv_tmp));
185 
186  double tmp = lo_ieee_nan_value ();
187 
188  m.assign ("maxrss", tmp);
189  m.assign ("ixrss", tmp);
190  m.assign ("idrss", tmp);
191  m.assign ("isrss", tmp);
192  m.assign ("minflt", tmp);
193  m.assign ("majflt", tmp);
194  m.assign ("nswap", tmp);
195  m.assign ("inblock", tmp);
196  m.assign ("oublock", tmp);
197  m.assign ("msgsnd", tmp);
198  m.assign ("msgrcv", tmp);
199  m.assign ("nsignals", tmp);
200  m.assign ("nvcsw", tmp);
201  m.assign ("nivcsw", tmp);
202 
203 #endif
204 
205  return octave_value (m);
206 }
#define DEFUN(name, args_name, nargout_name, doc)
Definition: defun.h:44
#define RUSAGE_SELF
Definition: getrusage.cc:57
double lo_ieee_nan_value(void)
Definition: lo-ieee.cc:126
void assign(const std::string &k, const octave_value &val)
Definition: oct-map.h:225
#define HZ
Definition: getrusage.cc:52
return octave_value(v1.char_array_value().concat(v2.char_array_value(), ra_idx),((a1.is_sq_string()||a2.is_sq_string())? '\'': '"'))