source: mainline/uspace/lib/c/generic/stats.c@ 1be7bee

Last change on this file since 1be7bee was 38d8849, checked in by Jiří Zárevúcky <jiri.zarevucky@…>, 7 years ago

Privatize <thread.h>.

  • Property mode set to 100644
File size: 6.8 KB
RevLine 
[9dae191e]1/*
2 * Copyright (c) 2010 Stanislav Kozina
3 * Copyright (c) 2010 Martin Decky
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @addtogroup libc
31 * @{
32 */
33/** @file
34 */
35
36#include <stats.h>
37#include <sysinfo.h>
38#include <errno.h>
39#include <stdio.h>
40#include <inttypes.h>
[38d150e]41#include <stdlib.h>
[9dae191e]42
43#define SYSINFO_STATS_MAX_PATH 64
44
[e1b6742]45/** Thread states
46 *
47 */
48static const char *thread_states[] = {
49 "Invalid",
50 "Running",
51 "Sleeping",
52 "Ready",
53 "Entering",
54 "Exiting",
55 "Lingering"
56};
57
[80bfb601]58/** Get CPUs statistics
59 *
60 * @param count Number of records returned.
61 *
62 * @return Array of stats_cpu_t structures.
63 * If non-NULL then it should be eventually freed
64 * by free().
65 *
66 */
[c3d4bb45]67stats_cpu_t *stats_get_cpus(size_t *count)
[9dae191e]68{
69 size_t size = 0;
70 stats_cpu_t *stats_cpus =
71 (stats_cpu_t *) sysinfo_get_data("system.cpus", &size);
[a35b458]72
[311bc25]73 if ((size % sizeof(stats_cpu_t)) != 0) {
74 if (stats_cpus != NULL)
75 free(stats_cpus);
76 *count = 0;
77 return NULL;
78 }
[a35b458]79
[9dae191e]80 *count = size / sizeof(stats_cpu_t);
81 return stats_cpus;
82}
83
[80bfb601]84/** Get physical memory statistics
85 *
86 *
87 * @return Pointer to the stats_physmem_t structure.
88 * If non-NULL then it should be eventually freed
89 * by free().
90 *
91 */
[c3d4bb45]92stats_physmem_t *stats_get_physmem(void)
[9dae191e]93{
94 size_t size = 0;
95 stats_physmem_t *stats_physmem =
96 (stats_physmem_t *) sysinfo_get_data("system.physmem", &size);
[a35b458]97
[311bc25]98 if (size != sizeof(stats_physmem_t)) {
99 if (stats_physmem != NULL)
100 free(stats_physmem);
101 return NULL;
102 }
[a35b458]103
[9dae191e]104 return stats_physmem;
105}
106
[dec16a2]107/** Get task statistics
[80bfb601]108 *
[dec16a2]109 * @param count Number of records returned.
[80bfb601]110 *
[dec16a2]111 * @return Array of stats_task_t structures.
[80bfb601]112 * If non-NULL then it should be eventually freed
113 * by free().
114 *
115 */
[dec16a2]116stats_task_t *stats_get_tasks(size_t *count)
[9dae191e]117{
118 size_t size = 0;
[dec16a2]119 stats_task_t *stats_tasks =
120 (stats_task_t *) sysinfo_get_data("system.tasks", &size);
[a35b458]121
[311bc25]122 if ((size % sizeof(stats_task_t)) != 0) {
123 if (stats_tasks != NULL)
124 free(stats_tasks);
125 *count = 0;
126 return NULL;
127 }
[a35b458]128
[dec16a2]129 *count = size / sizeof(stats_task_t);
130 return stats_tasks;
[9dae191e]131}
132
[80bfb601]133/** Get single task statistics
134 *
135 * @param task_id Task ID we are interested in.
136 *
137 * @return Pointer to the stats_task_t structure.
138 * If non-NULL then it should be eventually freed
139 * by free().
140 *
141 */
[c3d4bb45]142stats_task_t *stats_get_task(task_id_t task_id)
[9dae191e]143{
144 char name[SYSINFO_STATS_MAX_PATH];
145 snprintf(name, SYSINFO_STATS_MAX_PATH, "system.tasks.%" PRIu64, task_id);
[a35b458]146
[9dae191e]147 size_t size = 0;
148 stats_task_t *stats_task =
149 (stats_task_t *) sysinfo_get_data(name, &size);
[a35b458]150
[311bc25]151 if (size != sizeof(stats_task_t)) {
152 if (stats_task != NULL)
153 free(stats_task);
154 return NULL;
155 }
[a35b458]156
[9dae191e]157 return stats_task;
158}
159
[dec16a2]160/** Get thread statistics.
[e1b6742]161 *
[dec16a2]162 * @param count Number of records returned.
[e1b6742]163 *
[dec16a2]164 * @return Array of stats_thread_t structures.
[e1b6742]165 * If non-NULL then it should be eventually freed
166 * by free().
167 *
168 */
[dec16a2]169stats_thread_t *stats_get_threads(size_t *count)
[e1b6742]170{
171 size_t size = 0;
[dec16a2]172 stats_thread_t *stats_threads =
173 (stats_thread_t *) sysinfo_get_data("system.threads", &size);
[a35b458]174
[311bc25]175 if ((size % sizeof(stats_thread_t)) != 0) {
176 if (stats_threads != NULL)
177 free(stats_threads);
178 *count = 0;
179 return NULL;
180 }
[a35b458]181
[dec16a2]182 *count = size / sizeof(stats_thread_t);
183 return stats_threads;
[e1b6742]184}
185
[8eec3c8]186/** Get exception statistics.
187 *
188 * @param count Number of records returned.
189 *
190 * @return Array of stats_exc_t structures.
191 * If non-NULL then it should be eventually freed
192 * by free().
193 *
194 */
195stats_exc_t *stats_get_exceptions(size_t *count)
196{
197 size_t size = 0;
198 stats_exc_t *stats_exceptions =
199 (stats_exc_t *) sysinfo_get_data("system.exceptions", &size);
[a35b458]200
[311bc25]201 if ((size % sizeof(stats_exc_t)) != 0) {
202 if (stats_exceptions != NULL)
203 free(stats_exceptions);
204 *count = 0;
205 return NULL;
206 }
[a35b458]207
[8eec3c8]208 *count = size / sizeof(stats_exc_t);
209 return stats_exceptions;
210}
211
212/** Get single exception statistics
213 *
214 * @param excn Exception number we are interested in.
215 *
216 * @return Pointer to the stats_exc_t structure.
217 * If non-NULL then it should be eventually freed
218 * by free().
219 *
220 */
221stats_exc_t *stats_get_exception(unsigned int excn)
222{
223 char name[SYSINFO_STATS_MAX_PATH];
[311bc25]224 snprintf(name, SYSINFO_STATS_MAX_PATH, "system.exceptions.%u", excn);
[a35b458]225
[8eec3c8]226 size_t size = 0;
227 stats_exc_t *stats_exception =
228 (stats_exc_t *) sysinfo_get_data(name, &size);
[a35b458]229
[311bc25]230 if (size != sizeof(stats_exc_t)) {
231 if (stats_exception != NULL)
232 free(stats_exception);
233 return NULL;
234 }
[a35b458]235
[8eec3c8]236 return stats_exception;
237}
238
[80bfb601]239/** Get system load
240 *
241 * @param count Number of load records returned.
242 *
243 * @return Array of load records (load_t).
244 * If non-NULL then it should be eventually freed
245 * by free().
246 *
247 */
[c3d4bb45]248load_t *stats_get_load(size_t *count)
[9dae191e]249{
250 size_t size = 0;
251 load_t *load =
252 (load_t *) sysinfo_get_data("system.load", &size);
[a35b458]253
[311bc25]254 if ((size % sizeof(load_t)) != 0) {
255 if (load != NULL)
256 free(load);
257 *count = 0;
258 return NULL;
259 }
[a35b458]260
[9dae191e]261 *count = size / sizeof(load_t);
262 return load;
263}
264
[80bfb601]265/** Print load fixed-point value
266 *
267 * Print the load record fixed-point value in decimal
268 * representation on stdout.
269 *
270 * @param upper Load record.
271 * @param dec_length Number of decimal digits to print.
272 *
273 */
[c3d4bb45]274void stats_print_load_fragment(load_t upper, unsigned int dec_length)
[9dae191e]275{
276 /* Print the whole part */
[9696b01]277 printf("%u.", upper / LOAD_UNIT);
[a35b458]278
[9696b01]279 load_t rest = (upper % LOAD_UNIT) * 10;
[a35b458]280
[9dae191e]281 unsigned int i;
282 for (i = 0; i < dec_length; i++) {
[9696b01]283 printf("%u", rest / LOAD_UNIT);
284 rest = (rest % LOAD_UNIT) * 10;
[9dae191e]285 }
286}
287
[e1b6742]288const char *thread_get_state(state_t state)
289{
290 if (state <= Lingering)
291 return thread_states[state];
[a35b458]292
[e1b6742]293 return thread_states[Invalid];
294}
295
[9dae191e]296/** @}
297 */
Note: See TracBrowser for help on using the repository browser.