1e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner/* 2e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * Copyright (C) 2011 The Android Open Source Project 3e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * 4e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * Licensed under the Apache License, Version 2.0 (the "License"); 5e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * you may not use this file except in compliance with the License. 6e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * You may obtain a copy of the License at 7e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * 8e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * http://www.apache.org/licenses/LICENSE-2.0 9e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * 10e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * Unless required by applicable law or agreed to in writing, software 11e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * distributed under the License is distributed on an "AS IS" BASIS, 12e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * See the License for the specific language governing permissions and 14e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * limitations under the License. 15e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner */ 16e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 17e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner/* This program benchmarks a QEMUD pipe to exchange data with a test 18e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * server. 19e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * 20e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * See test_host_1.c for the corresponding server code, which simply 21e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner * sends back anything it receives from the client. 22e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner */ 23e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#include <stddef.h> 24e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#include <stdio.h> 25e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#include <stdlib.h> 26e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#include <errno.h> 27e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#include <string.h> 28e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#include "test_util.h" 29e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 30e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#define PIPE_NAME "pingpong" 31e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 32e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turnerchar* progname; 33e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 34e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turnerstatic void usage(int code) 35e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner{ 36e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner printf("Usage: %s [options]\n\n", progname); 37e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner printf( 38e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner "Valid options are:\n\n" 39e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner " -? -h --help Print this message\n" 40e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner " -pipe <name> Use pipe name (default: " PIPE_NAME ")\n" 41e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner " -tcp <port> Use local tcp port\n" 42e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner " -size <size> Specify packet size\n" 43e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner "\n" 44e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner ); 45e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner exit(code); 46e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner} 47e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 48e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turnerint main(int argc, char** argv) 49e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner{ 50e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner Pipe pipe[1]; 51e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner const char* tcpPort = NULL; 52e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner int localPort = 0; 53e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner const char* pipeName = NULL; 54e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner const char* packetSize = NULL; 55e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner int port = 8012; 56e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner int maxCount = 1000; 57e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner int bufferSize = 16384; 58e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner uint8_t* buffer; 59e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner uint8_t* buffer2; 60e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner int nn, count; 61e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner double time0, time1; 62e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 63e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner /* Extract program name */ 64e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner { 65e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner char* p = strrchr(argv[0], '/'); 66e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (p == NULL) 67e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner progname = argv[0]; 68e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner else 69e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner progname = p+1; 70e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 71e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 72e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner /* Parse options */ 73e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner while (argc > 1 && argv[1][0] == '-') { 74e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner char* arg = argv[1]; 75e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (!strcmp(arg, "-?") || !strcmp(arg, "-h") || !strcmp(arg, "--help")) { 76e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner usage(0); 77e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } else if (!strcmp(arg, "-pipe")) { 78e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (argc < 3) { 79e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner fprintf(stderr, "-pipe option needs an argument! See --help for details.\n"); 80e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner exit(1); 81e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 82e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner argc--; 83e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner argv++; 84e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner pipeName = argv[1]; 85e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } else if (!strcmp(arg, "-tcp")) { 86e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (argc < 3) { 87e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner fprintf(stderr, "-tcp option needs an argument! See --help for details.\n"); 88e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner exit(1); 89e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 90e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner argc--; 91e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner argv++; 92e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner tcpPort = argv[1]; 93e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } else if (!strcmp(arg, "-size")) { 94e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (argc < 3) { 95e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner fprintf(stderr, "-tcp option needs an argument! See --help for details.\n"); 96e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner exit(1); 97e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 98e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner argc--; 99e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner argv++; 100e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner packetSize = argv[1]; 101e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } else { 102e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner fprintf(stderr, "UNKNOWN OPTION: %s\n\n", arg); 103e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner usage(1); 104e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 105e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner argc--; 106e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner argv++; 107e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 108e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 109e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner /* Check arguments */ 110e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (tcpPort && pipeName) { 111e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner fprintf(stderr, "You can't use both -pipe and -tcp at the same time\n"); 112e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner exit(2); 113e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 114e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 115e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (tcpPort != NULL) { 116e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner localPort = atoi(tcpPort); 117e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (localPort <= 0 || localPort > 65535) { 118e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner fprintf(stderr, "Invalid port number: %s\n", tcpPort); 119e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner exit(2); 120e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 121e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } else if (pipeName == NULL) { 122e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner /* Use default pipe name */ 123e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner pipeName = PIPE_NAME; 124e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 125e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 126e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (packetSize != NULL) { 127e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner int size = atoi(packetSize); 128e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (size <= 0) { 129e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner fprintf(stderr, "Invalid byte size: %s\n", packetSize); 130e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner exit(3); 131e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 132e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner bufferSize = size; 133e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 134e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 135e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner /* Open the pipe */ 136e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (tcpPort != NULL) { 137e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (pipe_openSocket(pipe, localPort) < 0) { 138e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner fprintf(stderr, "Could not open tcp socket!\n"); 139e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner return 1; 140e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 141e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner printf("Connected to tcp:localhost:%d\n", port); 142e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 143e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner else { 144e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (pipe_openQemuPipe(pipe, pipeName) < 0) { 145e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner fprintf(stderr, "Could not open '%s' pipe: %s\n", pipeName, strerror(errno)); 146e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner return 1; 147e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 148e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner printf("Connected to '%s' pipe\n", pipeName); 149e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 150e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 151e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner /* Allocate buffers, setup their data */ 152e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner buffer = malloc(bufferSize); 153e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner buffer2 = malloc(bufferSize); 154e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 155e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner for (nn = 0; nn < bufferSize; nn++) { 156e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner buffer[nn] = (uint8_t)nn; 157e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 158e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 159e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner /* Do the work! */ 160e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner time0 = now_secs(); 161e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 162e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner for (count = 0; count < maxCount; count++) { 163e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner int ret = pipe_send(pipe, buffer, bufferSize); 164e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner int pos, len; 165e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 166e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (ret < 0) { 167e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner fprintf(stderr,"%d: Sending %d bytes failed: %s\n", count, bufferSize, strerror(errno)); 168e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner return 1; 169e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 170e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 171e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#if 1 172e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner /* The server is supposed to send the message back */ 173e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner pos = 0; 174e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner len = bufferSize; 175e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner while (len > 0) { 176e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner ret = pipe_recv(pipe, buffer2 + pos, len); 177e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (ret < 0) { 178e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner fprintf(stderr, "Receiving failed (ret=%d): %s\n", ret, strerror(errno)); 179e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner return 3; 180e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 181e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (ret == 0) { 182e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner fprintf(stderr, "Disconnection while receiving!\n"); 183e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner return 4; 184e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 185e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner pos += ret; 186e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner len -= ret; 187e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 188e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 189e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (memcmp(buffer, buffer2, bufferSize) != 0) { 190e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner fprintf(stderr, "Message content mismatch!\n"); 191e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner const int maxAvail = 16; 192e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner const int maxLines = 12; 193e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner int numLines = 0; 194e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner for (nn = 0; nn < bufferSize; ) { 195e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner int avail = bufferSize - nn; 196e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner int mm; 197e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (avail > maxAvail) 198e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner avail = maxAvail; 199e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 200e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (memcmp(buffer+nn, buffer2+nn, avail) != 0) { 201e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (++numLines >= maxLines) { 202e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner printf(".... to be continued ...\n"); 203e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner break; 204e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 205e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner printf("%04x:", nn); 206e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 207e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner for (mm = 0; mm < avail; mm++) 208e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner printf(" %02x", buffer[nn+mm]); 209e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner for ( ; mm < maxAvail; mm++ ) 210e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner printf(" "); 211e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 212e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner printf( " -- " ); 213e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 214e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner for (mm = 0; mm < avail; mm++) 215e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner printf(" %02x", buffer2[nn+mm]); 216e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 217e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner printf ("\n"); 218e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 219e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner nn += avail; 220e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 221e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner return 6; 222e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 223e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 224e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner#endif 225e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 226e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner if (count > 0 && (count % 200) == 0) { 227e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner printf("... %d\n", count); 228e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 229e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner } 230e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 231e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner time1 = now_secs(); 232e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 233e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner printf("Closing pipe\n"); 234e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner pipe_close(pipe); 235e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner 236e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner printf("Total time: %g seconds\n", time1 - time0); 237e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner printf("Total bytes: %g bytes\n", 1.0*maxCount*bufferSize); 238e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner printf("Bandwidth: %g MB/s\n", (maxCount*bufferSize/(1024.0*1024.0))/(time1 - time0) ); 239e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner return 0; 240e1eea50214580061e18e71e9b1ed56c7e721b751David 'Digit' Turner} 241