1/* 2 * Copyright (c) 2006 Apple Inc. All Rights Reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28 29 30#ifdef __sun 31#pragma ident "@(#)write.c 1.3 05/08/04 Apple Inc." 32#endif 33 34#ifdef linux 35#define _XOPEN_SOURCE 500 36#endif 37 38#include <unistd.h> 39#include <stdlib.h> 40#include <stdio.h> 41#include <fcntl.h> 42 43#include "../libmicro.h" 44 45typedef struct { 46 char *ts_buf; 47 int ts_fd; 48} tsd_t; 49 50#define DEFF "/dev/null" 51#define DEFS 1024 52 53static int optc = 0; 54static char *optf = DEFF; 55static long long opts = DEFS; 56static int optd; 57 58int 59benchmark_init() 60{ 61 lm_tsdsize = sizeof (tsd_t); 62 63 (void) sprintf(lm_optstr, "cdf:s:"); 64 65 (void) sprintf(lm_usage, 66 " [-f file-to-write (default %s)]\n" 67 " [-s buffer-size (default %d)]\n" 68 " [-c ] (make sure buffer is in cache)\n" 69#ifdef __sun 70 " [-d ] use directio" 71#endif 72 "notes: measures lmbench_write()\n", 73 DEFF, DEFS); 74 75 (void) sprintf(lm_header, "%8s", "size"); 76 77 lm_defB = 1; 78 79 return (0); 80} 81 82int 83benchmark_optswitch(int opt, char *optarg) 84{ 85 switch (opt) { 86 87 case 'd': 88 optd++; 89 break; 90 case 'c': 91 optc++; 92 break; 93 case 'f': 94 optf = optarg; 95 break; 96 case 's': 97 opts = sizetoll(optarg); 98 break; 99 default: 100 return (-1); 101 } 102 return (0); 103} 104 105int 106benchmark_initbatch(void *tsd) 107{ 108 tsd_t *ts = (tsd_t *)tsd; 109 int i; 110 111 if (ts->ts_buf == NULL) { 112 ts->ts_buf = malloc(opts); 113 ts->ts_fd = open(optf, O_WRONLY); 114 115#ifdef __sun 116 if (optd) 117 (void) directio(ts->ts_fd, DIRECTIO_ON); 118#endif 119 /* 120 * bring buf into cache if specified. 121 */ 122 123 if (optc) 124 for (i = 0; i < opts; i++) 125 ts->ts_buf[i] = 0; 126 } 127 128 (void) lseek(ts->ts_fd, 0, SEEK_SET); 129 130 return (0); 131} 132 133int 134benchmark(void *tsd, result_t *res) 135{ 136 tsd_t *ts = (tsd_t *)tsd; 137 int i; 138 139/* 140 * The libmicro test uses a for loop as below: 141 * for (i = 0; i < lm_optB; i++) { 142 * 143 * we can probably get away with using lm_optB 144 * in the while loop below 145 * 146 */ 147 i = 0; 148 149 while (i++ < lm_optB) { 150 if (write(ts->ts_fd, ts->ts_buf, opts) != opts) { 151 res->re_errors++; 152 } 153 } 154 res->re_count = i; 155 156 return (0); 157} 158 159char * 160benchmark_result() 161{ 162 static char result[256]; 163 164 (void) sprintf(result, "%8lld", opts); 165 166 return (result); 167} 168