1 /*
2 * Copyright (c) International Business Machines Corp., 2001
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
12 * the GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 /* FUNCTIONS: Scheduler Test Suite */
20
21 /*---------------------------------------------------------------------+
22 | sched_tc0 |
23 | ==================================================================== |
24 | |
25 | Description: Creates long-term disk I/O bound process |
26 | |
27 | Algorithm: o Set process priority |
28 | o Open a large file and repeatedly read from it |
29 | for a specified time duration |
30 | |
31 | To compile: cc -o sched_tc0 sched_tc0.c -L. -lpsc |
32 | |
33 | Usage: sched_tc0 [-t sec] [-p priority] [-v] [-d] |
34 | |
35 | Last update: Ver. 1.3, 4/10/94 23:04:59 |
36 | |
37 | Change Activity |
38 | |
39 | Version Date Name Reason |
40 | 0.1 050689 CTU Initial version |
41 | 0.2 010402 Manoj Iyer Ported to Linux |
42 | |
43 +---------------------------------------------------------------------*/
44
45 #include <stdlib.h>
46 #include <sys/time.h>
47 #include <sys/resource.h>
48 #include "sched.h"
49
50 /*
51 * Defines:
52 *
53 * USAGE: usage statement
54 *
55 * DEFAULT_PRIORITY_TYPE: default priority
56 *
57 * DEFAULT_EXECUTION_TIME: default execution time (in seconds)
58 *
59 */
60 #define DEFAULT_PRIORITY_TYPE "variable"
61 #define DEFAULT_EXECUTION_TIME 1800
62 #define USAGE "Usage: %s [-p priority] [-t sec] [-v] [-d] \n" \
63 " -t sec execution time (default 1800 sec) \n" \
64 " -p priority priority (default variable) \n" \
65 " -v verbose \n" \
66 " -d enable debugging messages \n"
67
68 /*
69 * Function prototypes:
70 *
71 * process_file: reads data file
72 *
73 * parse_args: parse command line arguments
74 */
75 void process_file(char *);
76 void parse_args(int, char **);
77
78 /*
79 * Global variables:
80 *
81 * verbose: enable normal messages
82 *
83 * debug: enable debugging messages
84 *
85 * execution_time: testcase execution time (hours)
86 *
87 * priority: process type (fixed priority, variable priority)
88 */
89 int verbose = 0;
90 int debug = 0;
91 long execution_time = DEFAULT_EXECUTION_TIME;
92 char *priority = DEFAULT_PRIORITY_TYPE;
93
94 /*---------------------------------------------------------------------+
95 | main |
96 | ==================================================================== |
97 | |
98 | Function: ... |
99 | |
100 +---------------------------------------------------------------------*/
main(int argc,char ** argv)101 int main(int argc, char **argv)
102 {
103 char *filename = NULL;
104 long start_time; /* time at start of testcase */
105 int i;
106
107 if ((filename = getenv("KERNEL")) == NULL) {
108 errno = ENODATA;
109 sys_error("environment variable KERNEL not set", __FILE__,
110 __LINE__);
111 }
112 /*
113 * Process command line arguments...
114 */
115
116 parse_args(argc, argv);
117 if (verbose)
118 printf("%s: Scheduler TestSuite program\n\n", *argv);
119 if (debug) {
120 printf("\tpriority: %s\n", priority);
121 printf("\texecution_time: %ld (sec)\n", execution_time);
122 }
123
124 /*
125 * Adjust the priority of this process if the real time flag is set
126 */
127 if (!strcmp(priority, "fixed")) {
128 #ifndef __linux__
129 if (setpri(0, DEFAULT_PRIORITY) < 0)
130 sys_error("setpri failed", __FILE__, __LINE__);
131 #else
132 if (setpriority(PRIO_PROCESS, 0, 0) < 0)
133 sys_error("setpri failed", __FILE__, __LINE__);
134 #endif
135 }
136
137 /*
138 * Continuously read through file as time permits...
139 */
140 i = 0;
141 start_time = time(NULL);
142
143 if (debug)
144 printf("\n");
145 while ((time(NULL) - start_time) < execution_time) {
146 if (debug) {
147 printf("\r\tprocessing file [%d], time left: %ld",
148 i++,
149 execution_time - (time(NULL) - start_time));
150 fflush(stdout);
151 }
152 process_file(filename);
153 }
154 if (debug)
155 printf("\n");
156
157 /*
158 * Exit with success!
159 */
160 if (verbose)
161 printf("\nsuccessful!\n");
162 return (0);
163 }
164
165 /*---------------------------------------------------------------------+
166 | process_file () |
167 | ==================================================================== |
168 | |
169 | Function: Opens a file, reads from it until it encounters an |
170 | end-of-file and then closes the file.. |
171 | |
172 +---------------------------------------------------------------------*/
process_file(char * filename)173 void process_file(char *filename)
174 {
175 char record[100]; /* holds each record of the file read */
176 FILE *datafile; /* file pointer to the open file */
177
178 /*
179 * Try and open the datafile
180 */
181 if ((datafile = fopen(filename, "r")) == NULL)
182 sys_error("fopen failed", __FILE__, __LINE__);
183
184 /*
185 * Read the first record of the datafile, then read until end-of-file
186 */
187 while (fgets(record, 80, datafile)) {
188 if (feof(datafile))
189 break;
190 }
191
192 /*
193 * Close the datafile
194 */
195 if (fclose(datafile))
196 sys_error("fclose failed", __FILE__, __LINE__);
197 }
198
199 /*---------------------------------------------------------------------+
200 | parse_args () |
201 | ==================================================================== |
202 | |
203 | Function: Parse the command line arguments & initialize global |
204 | variables. |
205 | |
206 | Updates: (command line options) |
207 | |
208 | [-p] priority: "fixed" or "variable" |
209 | [-t] n: execution time in hours |
210 | [-v] verbose |
211 | [-d] enable debugging messages |
212 | |
213 +---------------------------------------------------------------------*/
parse_args(int argc,char ** argv)214 void parse_args(int argc, char **argv)
215 {
216 int opt;
217 int pflg = 0, tflg = 0;
218 int errflag = 0;
219 char *program_name = *argv;
220 extern char *optarg; /* Command line option */
221
222 if (argc < 2) {
223 fprintf(stderr, USAGE, program_name);
224 exit(0);
225 }
226
227 /*
228 * Parse command line options.
229 */
230 while ((opt = getopt(argc, argv, "p:t:vd")) != EOF) {
231 switch (opt) {
232 case 'p': /* process type */
233 pflg++;
234 priority = optarg;
235 break;
236 case 't': /* time (hours) */
237 tflg++;
238 execution_time = atof(optarg);
239 break;
240 case 'v': /* verbose */
241 verbose++;
242 break;
243 case 'd': /* enable debugging messages */
244 verbose++;
245 debug++;
246 break;
247 default:
248 errflag++;
249 break;
250 }
251 }
252
253 /*
254 * Check percentage, execution time and process slots...
255 */
256 if (pflg) {
257 if (strcmp(priority, "fixed") && strcmp(priority, "variable"))
258 errflag++;
259 }
260 if (tflg) {
261 if (execution_time < 0.0 || execution_time > 360000)
262 errflag++;
263 }
264 if (errflag) {
265 fprintf(stderr, USAGE, program_name);
266 exit(2);
267 }
268 }
269