1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms 5 * of the Common Development and Distribution License 6 * (the "License"). You may not use this file except 7 * in compliance with the License. 8 * 9 * You can obtain a copy of the license at 10 * src/OPENSOLARIS.LICENSE 11 * or http://www.opensolaris.org/os/licensing. 12 * See the License for the specific language governing 13 * permissions and limitations under the License. 14 * 15 * When distributing Covered Code, include this CDDL 16 * HEADER in each file and include the License file at 17 * usr/src/OPENSOLARIS.LICENSE. If applicable, 18 * add the following below this CDDL HEADER, with the 19 * fields enclosed by brackets "[]" replaced with your 20 * own identifying information: Portions Copyright [yyyy] 21 * [name of copyright owner] 22 * 23 * CDDL HEADER END 24 */ 25 26 /* 27 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 28 * Use is subject to license terms. 29 */ 30 31 #include <unistd.h> 32 #include <stdlib.h> 33 #include <stdio.h> 34 #include <string.h> 35 #include <sys/socket.h> 36 37 #include "libmicro.h" 38 39 typedef struct { 40 int ts_once; 41 int *ts_fds; 42 } tsd_t; 43 44 #define DEFN 256 45 46 47 int 48 benchmark_init() 49 { 50 lm_tsdsize = sizeof (tsd_t); 51 52 lm_defB = 256; 53 54 (void) sprintf(lm_usage, 55 "notes: measures socketpair\n"); 56 57 return (0); 58 } 59 60 61 int 62 benchmark_initrun() 63 { 64 (void) setfdlimit(lm_optB * lm_optT + 10); 65 return (0); 66 } 67 68 int 69 benchmark_initbatch(void *tsd) 70 { 71 int i; 72 tsd_t *ts = (tsd_t *)tsd; 73 74 if (ts->ts_once++ == 0) { 75 ts->ts_fds = (int *)malloc(lm_optB * sizeof (int)); 76 if (ts->ts_fds == NULL) { 77 return (1); 78 } 79 for (i = 0; i < lm_optB; i++) { 80 ts->ts_fds[i] = -1; 81 } 82 } 83 84 return (0); 85 } 86 87 int 88 benchmark(void *tsd, result_t *res) 89 { 90 int i; 91 tsd_t *ts = (tsd_t *)tsd; 92 93 res->re_count = 0; 94 res->re_errors = 0; 95 96 for (i = 0; i < lm_optB; i += 2) { 97 if (socketpair(PF_UNIX, SOCK_STREAM, 0, &ts->ts_fds[i]) 98 == -1) { 99 res->re_errors++; 100 } 101 } 102 res->re_count = lm_optB / 2; 103 104 return (0); 105 } 106 107 int 108 benchmark_finibatch(void *tsd) 109 { 110 int i; 111 tsd_t *ts = (tsd_t *)tsd; 112 113 for (i = 0; i < lm_optB; i++) { 114 (void) close(ts->ts_fds[i]); 115 } 116 117 return (0); 118 } 119