|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: /* ! 25: * readq.m - Read using queued I/O ! 26: */ ! 27: ! 28: #import <bsd/sys/types.h> ! 29: #import <driverkit/IOClient.h> ! 30: #import <ansi/stdio.h> ! 31: #import <mach/kern_return.h> ! 32: #import <mach/mach.h> ! 33: #import <ansi/stdlib.h> ! 34: #import <bsd/libc.h> ! 35: #import "buflib.h" ! 36: #import "defaults.h" ! 37: #import <bsd/sys/signal.h> ! 38: #import <mach/mach_error.h> ! 39: ! 40: void usage(char **argv); ! 41: void exit(int exitcode); ! 42: void sigint(int foo); ! 43: ! 44: int read_requests = 0; ! 45: int read_replies = 0; ! 46: ! 47: int main(int argc, char **argv) { ! 48: ! 49: int arg; ! 50: char c; ! 51: id idClient; ! 52: IOReturn rtn; ! 53: char *rbuf, *rrbuf; ! 54: kern_return_t krtn; ! 55: u_int bytes_xfr; ! 56: int i; ! 57: int io_num; ! 58: IOErrorString outstr; ! 59: int loop_num = 0; ! 60: ! 61: /* ! 62: * user-spec'd variables ! 63: */ ! 64: u_char dump_data = 0; /* dump read data to stdout */ ! 65: u_int byte_count=BYTE_COUNT_DEFAULT; /* bytes to read */ ! 66: u_int block_num=0; ! 67: char *hostname=HOST_DEFAULT; ! 68: char *devname=DEVICE_DEFAULT; ! 69: int num_ios; ! 70: int loop = 0; ! 71: ! 72: if(argc < 2) ! 73: usage(argv); ! 74: num_ios = atoi(argv[1]); ! 75: ! 76: /* ! 77: * Get standard defaults from environment or defaults.h ! 78: */ ! 79: get_default("byte_count", &byte_count, BYTE_COUNT_DEFAULT); ! 80: get_default_t("hostname", &hostname, HOST_DEFAULT); ! 81: get_default_t("devname", &devname, DEVICE_DEFAULT); ! 82: ! 83: for(arg=2; arg<argc; arg++) { ! 84: c = argv[arg][0]; ! 85: switch(c) { ! 86: case 'y': ! 87: byte_count = atoi(&argv[arg][2]); ! 88: break; ! 89: case 'h': ! 90: hostname = &argv[arg][2]; ! 91: break; ! 92: case 'd': ! 93: devname = &argv[arg][2]; ! 94: break; ! 95: case 'b': ! 96: block_num = atoi(&argv[arg][2]); ! 97: break; ! 98: case 'p': ! 99: dump_data++; ! 100: break; ! 101: case 'l': ! 102: loop++; ! 103: break; ! 104: default: ! 105: usage(argv); ! 106: } ! 107: } ! 108: signal(SIGINT, sigint); ! 109: ! 110: rtn = [IOClient clientOpen:devname ! 111: hostName:hostname ! 112: intentions:IO_INT_READ ! 113: idp:&idClient]; ! 114: if(rtn) { ! 115: [IOClient ioError:rtn ! 116: logString:"clientOpen" ! 117: outString:outstr]; ! 118: printf(outstr); ! 119: exit(1); ! 120: } ! 121: krtn = vm_allocate(task_self(), ! 122: (vm_address_t *)&rbuf, ! 123: byte_count * num_ios, ! 124: TRUE); ! 125: if(krtn) { ! 126: mach_error("vm_allocate", krtn); ! 127: exit(1); ! 128: } ! 129: for(i=0; i<byte_count * num_ios; i++) ! 130: rbuf[i] = 0x5a; ! 131: ! 132: do { ! 133: ! 134: /* ! 135: * fire off num_ios queued read requests. ! 136: */ ! 137: for(io_num=1; io_num<=num_ios; io_num++) { ! 138: ! 139: rtn = [idClient ioReadAsync:block_num+io_num ! 140: bytesReq:byte_count ! 141: queueId:io_num]; ! 142: if(rtn != IO_R_SUCCESS) { ! 143: [IOClient ioError:rtn ! 144: logString:"ioReadAsync" ! 145: outString:outstr]; ! 146: printf(outstr); ! 147: exit(1); ! 148: } ! 149: read_requests++; ! 150: } ! 151: ! 152: /* ! 153: * now wait for the data, in reverse order. ! 154: */ ! 155: rrbuf = rbuf + num_ios * byte_count; ! 156: for(io_num=num_ios; io_num; io_num--) { ! 157: rrbuf -= byte_count; ! 158: rtn = [idClient ioReadWait:io_num ! 159: buf:rrbuf ! 160: bytesXfr:&bytes_xfr]; ! 161: if(rtn != IO_R_SUCCESS) { ! 162: [IOClient ioError:rtn ! 163: logString:"ioReadWait" ! 164: outString:outstr]; ! 165: printf(outstr); ! 166: exit(1); ! 167: } ! 168: read_replies++; ! 169: if(bytes_xfr != byte_count) { ! 170: printf("bytes_xfr = %d; expected %d\n", ! 171: bytes_xfr, byte_count); ! 172: } ! 173: if(dump_data) { ! 174: printf("Read data, block %d\n", ! 175: block_num+io_num); ! 176: dump_buf((u_char *)rrbuf, bytes_xfr); ! 177: printf("\n"); ! 178: } ! 179: } ! 180: if(++loop_num % 100 == 0) { ! 181: printf("."); ! 182: fflush(stdout); ! 183: } ! 184: } while(loop); ! 185: rtn = [idClient ioClose]; ! 186: if(rtn) { ! 187: [IOClient ioError:rtn ! 188: logString:"ioClose" ! 189: outString:outstr]; ! 190: printf(outstr); ! 191: exit(1); ! 192: } ! 193: else if(!dump_data) ! 194: printf("...ok\n"); ! 195: exit(0); ! 196: ! 197: } /* main() */ ! 198: ! 199: void usage(char **argv) { ! 200: printf("usage: %s num_ios [l(oop)] [y=byte_count] [p (dump data)] [b=block_num] [h=hostname] [d=devname]\n", argv[0]); ! 201: exit(1); ! 202: } ! 203: ! 204: void sigint(int foo) ! 205: { ! 206: printf("\nAborting.\n"); ! 207: printf("%d read requests\n", read_requests); ! 208: printf("%d read replies\n", read_replies); ! 209: exit(1); ! 210: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.