source: mainline/uspace/app/testread/testread.c@ 054476d

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 054476d was 1ab8539, checked in by Martin Decky <martin@…>, 11 years ago

remove system.uptime sysinfo entry since it is redundant
cleanup the time handling routines

  • still more cleanup is needed here, the code is a wild combination of quasi-POSIX API (with all the brain-dead types, etc.) and HelenOS API
  • Property mode set to 100644
File size: 4.9 KB
Line 
1/*
2 * Copyright (c) 2011 Martin Sucha
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup test
30 * @{
31 */
32
33/**
34 * @file testread.c
35 * This program checks if the file contains a pattern of increasing
36 * 64 bit unsigned integers (that may overflow at some point)
37 * stored in little endian byte order.
38 * This is to verify that the filesystem reads
39 * the files correctly.
40 * If the file does not contain specified pattern, it stops
41 * at the point where the file does not match and prints
42 * the byte offset at which the error occured.
43 * While checking the file, the program displays how many megabytes
44 * it has already read, how long it took to read the last megabyte
45 * and current and average read speed.
46 *
47 */
48
49#include <stdio.h>
50#include <stdlib.h>
51#include <mem.h>
52#include <loc.h>
53#include <byteorder.h>
54#include <sys/types.h>
55#include <sys/typefmt.h>
56#include <inttypes.h>
57#include <errno.h>
58#include <time.h>
59
60#define NAME "testread"
61#define BUFELEMS 1024
62#define MBYTE (1024*1024)
63
64static void syntax_print(void);
65
66int main(int argc, char **argv)
67{
68
69 FILE *file;
70 char *file_name;
71 uint64_t *buf;
72 uint64_t expected;
73 aoff64_t offset;
74 aoff64_t next_mark;
75 aoff64_t last_mark;
76 unsigned int i;
77 bool check_enabled = true;
78 bool progress = true;
79
80 if (argc < 2) {
81 printf(NAME ": Error, argument missing.\n");
82 syntax_print();
83 return 1;
84 }
85
86 /* Skip program name */
87 --argc; ++argv;
88
89 if (argc > 0 && str_cmp(*argv, "--no-check") == 0) {
90 check_enabled = false;
91 --argc; ++argv;
92 }
93
94 if (argc > 0 && str_cmp(*argv, "--no-progress") == 0) {
95 progress = false;
96 --argc; ++argv;
97 }
98
99 if (argc != 1) {
100 printf(NAME ": Error, unexpected argument.\n");
101 syntax_print();
102 return 1;
103 }
104
105 file_name = *argv;
106
107 buf = calloc(BUFELEMS, sizeof(uint64_t));
108 if (buf == NULL) {
109 printf("Failed allocating buffer\n");
110 return 1;
111 }
112
113 file = fopen(file_name, "r");
114 if (file == NULL) {
115 printf("Failed opening file\n");
116 return 1;
117 }
118
119 expected = 0;
120 offset = 0;
121 next_mark = 0;
122 last_mark = 0;
123 struct timeval prev_time;
124 struct timeval start_time;
125 gettimeofday(&start_time, NULL);
126 prev_time = start_time;
127
128 while (!feof(file)) {
129 size_t elems = fread(buf, sizeof(uint64_t), BUFELEMS, file);
130 if (ferror(file)) {
131 printf("Failed reading file\n");
132 fclose(file);
133 free(buf);
134 return 1;
135 }
136
137 for (i = 0; i < elems; i++) {
138 if (check_enabled && uint64_t_le2host(buf[i]) != expected) {
139 printf("Unexpected value at offset %" PRIuOFF64 "\n", offset);
140 fclose(file);
141 free(buf);
142 return 2;
143 }
144 expected++;
145 offset += sizeof(uint64_t);
146 }
147
148 if (progress && offset >= next_mark) {
149 struct timeval cur_time;
150 gettimeofday(&cur_time, NULL);
151
152 uint32_t last_run = cur_time.tv_sec - prev_time.tv_sec;
153 uint32_t total_time = cur_time.tv_sec - start_time.tv_sec;
154 if (last_run > 0 && total_time > 0) {
155 printf("%" PRIuOFF64 "M - time: %u s, "
156 "cur: %"PRIuOFF64 " B/s, avg: %" PRIuOFF64 " B/s\n",
157 offset / MBYTE, last_run,
158 (offset-last_mark)/last_run,
159 offset/total_time);
160 prev_time = cur_time;
161 last_mark = offset;
162 }
163 next_mark += MBYTE;
164 }
165 }
166
167 struct timeval final_time;
168 gettimeofday(&final_time, NULL);
169
170 uint32_t total_run_time = final_time.tv_sec - start_time.tv_sec;
171 if (total_run_time > 0) {
172 printf("total bytes: %" PRIuOFF64
173 ", total time: %u s, avg speed: %" PRIuOFF64 " B/s\n",
174 offset,
175 total_run_time,
176 offset/total_run_time);
177 }
178
179 fclose(file);
180 free(buf);
181
182 return 0;
183}
184
185
186static void syntax_print(void)
187{
188 printf("syntax: testread <filename>\n");
189}
190
191/**
192 * @}
193 */
Note: See TracBrowser for help on using the repository browser.