269 lines
8.6 KiB
C
269 lines
8.6 KiB
C
/*
|
|
* Copyright (c) International Business Machines Corp., 2001
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
|
* the GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
/* FUNCTIONS: Scheduler Test Suite */
|
|
|
|
/*---------------------------------------------------------------------+
|
|
| sched_tc0 |
|
|
| ==================================================================== |
|
|
| |
|
|
| Description: Creates long-term disk I/O bound process |
|
|
| |
|
|
| Algorithm: o Set process priority |
|
|
| o Open a large file and repeatedly read from it |
|
|
| for a specified time duration |
|
|
| |
|
|
| To compile: cc -o sched_tc0 sched_tc0.c -L. -lpsc |
|
|
| |
|
|
| Usage: sched_tc0 [-t sec] [-p priority] [-v] [-d] |
|
|
| |
|
|
| Last update: Ver. 1.3, 4/10/94 23:04:59 |
|
|
| |
|
|
| Change Activity |
|
|
| |
|
|
| Version Date Name Reason |
|
|
| 0.1 050689 CTU Initial version |
|
|
| 0.2 010402 Manoj Iyer Ported to Linux |
|
|
| |
|
|
+---------------------------------------------------------------------*/
|
|
|
|
#include <stdlib.h>
|
|
#include <sys/time.h>
|
|
#include <sys/resource.h>
|
|
#include "sched.h"
|
|
|
|
/*
|
|
* Defines:
|
|
*
|
|
* USAGE: usage statement
|
|
*
|
|
* DEFAULT_PRIORITY_TYPE: default priority
|
|
*
|
|
* DEFAULT_EXECUTION_TIME: default execution time (in seconds)
|
|
*
|
|
*/
|
|
#define DEFAULT_PRIORITY_TYPE "variable"
|
|
#define DEFAULT_EXECUTION_TIME 1800
|
|
#define USAGE "Usage: %s [-p priority] [-t sec] [-v] [-d] \n" \
|
|
" -t sec execution time (default 1800 sec) \n" \
|
|
" -p priority priority (default variable) \n" \
|
|
" -v verbose \n" \
|
|
" -d enable debugging messages \n"
|
|
|
|
/*
|
|
* Function prototypes:
|
|
*
|
|
* process_file: reads data file
|
|
*
|
|
* parse_args: parse command line arguments
|
|
*/
|
|
void process_file(char *);
|
|
void parse_args(int, char **);
|
|
|
|
/*
|
|
* Global variables:
|
|
*
|
|
* verbose: enable normal messages
|
|
*
|
|
* debug: enable debugging messages
|
|
*
|
|
* execution_time: testcase execution time (hours)
|
|
*
|
|
* priority: process type (fixed priority, variable priority)
|
|
*/
|
|
int verbose = 0;
|
|
int debug = 0;
|
|
long execution_time = DEFAULT_EXECUTION_TIME;
|
|
char *priority = DEFAULT_PRIORITY_TYPE;
|
|
|
|
/*---------------------------------------------------------------------+
|
|
| main |
|
|
| ==================================================================== |
|
|
| |
|
|
| Function: ... |
|
|
| |
|
|
+---------------------------------------------------------------------*/
|
|
int main(int argc, char **argv)
|
|
{
|
|
char *filename = NULL;
|
|
long start_time; /* time at start of testcase */
|
|
int i;
|
|
|
|
if ((filename = getenv("KERNEL")) == NULL) {
|
|
errno = ENODATA;
|
|
sys_error("environment variable KERNEL not set", __FILE__,
|
|
__LINE__);
|
|
}
|
|
/*
|
|
* Process command line arguments...
|
|
*/
|
|
|
|
parse_args(argc, argv);
|
|
if (verbose)
|
|
printf("%s: Scheduler TestSuite program\n\n", *argv);
|
|
if (debug) {
|
|
printf("\tpriority: %s\n", priority);
|
|
printf("\texecution_time: %ld (sec)\n", execution_time);
|
|
}
|
|
|
|
/*
|
|
* Adjust the priority of this process if the real time flag is set
|
|
*/
|
|
if (!strcmp(priority, "fixed")) {
|
|
#ifndef __linux__
|
|
if (setpri(0, DEFAULT_PRIORITY) < 0)
|
|
sys_error("setpri failed", __FILE__, __LINE__);
|
|
#else
|
|
if (setpriority(PRIO_PROCESS, 0, 0) < 0)
|
|
sys_error("setpri failed", __FILE__, __LINE__);
|
|
#endif
|
|
}
|
|
|
|
/*
|
|
* Continuously read through file as time permits...
|
|
*/
|
|
i = 0;
|
|
start_time = time(NULL);
|
|
|
|
if (debug)
|
|
printf("\n");
|
|
while ((time(NULL) - start_time) < execution_time) {
|
|
if (debug) {
|
|
printf("\r\tprocessing file [%d], time left: %ld",
|
|
i++,
|
|
execution_time - (time(NULL) - start_time));
|
|
fflush(stdout);
|
|
}
|
|
process_file(filename);
|
|
}
|
|
if (debug)
|
|
printf("\n");
|
|
|
|
/*
|
|
* Exit with success!
|
|
*/
|
|
if (verbose)
|
|
printf("\nsuccessful!\n");
|
|
return (0);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------+
|
|
| process_file () |
|
|
| ==================================================================== |
|
|
| |
|
|
| Function: Opens a file, reads from it until it encounters an |
|
|
| end-of-file and then closes the file.. |
|
|
| |
|
|
+---------------------------------------------------------------------*/
|
|
void process_file(char *filename)
|
|
{
|
|
char record[100]; /* holds each record of the file read */
|
|
FILE *datafile; /* file pointer to the open file */
|
|
|
|
/*
|
|
* Try and open the datafile
|
|
*/
|
|
if ((datafile = fopen(filename, "r")) == NULL)
|
|
sys_error("fopen failed", __FILE__, __LINE__);
|
|
|
|
/*
|
|
* Read the first record of the datafile, then read until end-of-file
|
|
*/
|
|
while (fgets(record, 80, datafile)) {
|
|
if (feof(datafile))
|
|
break;
|
|
}
|
|
|
|
/*
|
|
* Close the datafile
|
|
*/
|
|
if (fclose(datafile))
|
|
sys_error("fclose failed", __FILE__, __LINE__);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------+
|
|
| parse_args () |
|
|
| ==================================================================== |
|
|
| |
|
|
| Function: Parse the command line arguments & initialize global |
|
|
| variables. |
|
|
| |
|
|
| Updates: (command line options) |
|
|
| |
|
|
| [-p] priority: "fixed" or "variable" |
|
|
| [-t] n: execution time in hours |
|
|
| [-v] verbose |
|
|
| [-d] enable debugging messages |
|
|
| |
|
|
+---------------------------------------------------------------------*/
|
|
void parse_args(int argc, char **argv)
|
|
{
|
|
int opt;
|
|
int pflg = 0, tflg = 0;
|
|
int errflag = 0;
|
|
char *program_name = *argv;
|
|
extern char *optarg; /* Command line option */
|
|
|
|
if (argc < 2) {
|
|
fprintf(stderr, USAGE, program_name);
|
|
exit(0);
|
|
}
|
|
|
|
/*
|
|
* Parse command line options.
|
|
*/
|
|
while ((opt = getopt(argc, argv, "p:t:vd")) != EOF) {
|
|
switch (opt) {
|
|
case 'p': /* process type */
|
|
pflg++;
|
|
priority = optarg;
|
|
break;
|
|
case 't': /* time (hours) */
|
|
tflg++;
|
|
execution_time = atof(optarg);
|
|
break;
|
|
case 'v': /* verbose */
|
|
verbose++;
|
|
break;
|
|
case 'd': /* enable debugging messages */
|
|
verbose++;
|
|
debug++;
|
|
break;
|
|
default:
|
|
errflag++;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Check percentage, execution time and process slots...
|
|
*/
|
|
if (pflg) {
|
|
if (strcmp(priority, "fixed") && strcmp(priority, "variable"))
|
|
errflag++;
|
|
}
|
|
if (tflg) {
|
|
if (execution_time < 0.0 || execution_time > 360000)
|
|
errflag++;
|
|
}
|
|
if (errflag) {
|
|
fprintf(stderr, USAGE, program_name);
|
|
exit(2);
|
|
}
|
|
}
|