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 39typedef struct { 40 int ts_once; 41 int *ts_fds; 42} tsd_t; 43 44#define DEFN 256 45 46 47int 48benchmark_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 61int 62benchmark_initrun() 63{ 64 (void) setfdlimit(lm_optB * lm_optT + 10); 65 return (0); 66} 67 68int 69benchmark_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 87int 88benchmark(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 = i / 2; 103 104 return (0); 105} 106 107int 108benchmark_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