int create_pipes(int p[][2], int procs) { int i; /* * Get a bunch of pipes. */ morefds(); for (i = 0; i < procs; ++i) { if (pipe(p[i]) == -1) { return i; } } return procs; }
int main(int ac, char **av) { state_t state; int parallel = 1; int warmup = 0; int repetitions = -1; int c; char* usage = "[-n <#descriptors>] [-P <parallelism>] [-W <warmup>] [-N <repetitions>] file|tcp\n"; char buf[256]; morefds(); /* bump fd_cur to fd_max */ state.num = 200; while (( c = getopt(ac, av, "P:W:N:n:")) != EOF) { switch(c) { case 'P': parallel = atoi(optarg); if (parallel <= 0) lmbench_usage(ac, av, usage); break; case 'W': warmup = atoi(optarg); break; case 'N': repetitions = atoi(optarg); break; case 'n': state.num = bytes(optarg); break; default: lmbench_usage(ac, av, usage); break; } } if (optind + 1 != ac) { lmbench_usage(ac, av, usage); } if (streq("tcp", av[optind])) { state.fid_f = open_socket; server(&state); benchmp(initialize, doit, cleanup, 0, parallel, warmup, repetitions, &state); sprintf(buf, "Select on %d tcp fd's", state.num); kill(state.pid, SIGKILL); waitpid(state.pid, NULL, 0); micro(buf, get_n()); } else if (streq("file", av[optind])) { state.fid_f = open_file; server(&state); benchmp(initialize, doit, cleanup, 0, parallel, warmup, repetitions, &state); unlink(state.fname); sprintf(buf, "Select on %d fd's", state.num); micro(buf, get_n()); } else { lmbench_usage(ac, av, usage); } exit(0); }
int benchmark_initworker(void *tsd) { // pulls in code from lmbench main and initialize int n = 0; /* * initialize your state variables here first */ tsd_t *ts = (tsd_t *)tsd; int N, fid, fd; /* * default number of file descriptors */ //(void) fprintf(stderr, "benchmark_initworker\n"); ts->num = 200; if (optn > 0) { ts->num = optn; } N = ts->num; //(void) fprintf(stderr, "benchmark_initworker ts->num is %i\n",ts->num); /* * grab more file descriptors */ morefds(); ts->fid_f = open_file; server(ts); //(void) fprintf(stderr, "benchmark_initworker: returned from server call\n"); /* * Initialize function from lmbench * for this test */ fid = (*ts->fid_f)(ts); //(void) fprintf(stderr, "initworker: fid is %i\n",fid); if (fid <= 0) { perror("Could not open device"); exit(1); } ts->max = 0; FD_ZERO(&(ts->set)); //(void) fprintf(stderr, "initworker FD_ZERO: ts->set result is %i\n",ts->set); //(void) fprintf(stderr, "initworker: N is %i\n",N); for (n = 0; n < N; n++) { //(void) fprintf(stderr, "benchmark_initworker: in the loop - N is %i: n is %i\n",N, n); fd = dup(fid); //(void) fprintf(stderr, "benchmark_initworker: dup result is %i\n",fd); //(void) fprintf(stderr, "benchmark_initworker: errno result is %d - \"%s\"\n",errno, strerror(errno)); if (fd == -1) break; if (fd > ts->max) ts->max = fd; FD_SET(fd, &(ts->set)); //(void) fprintf(stderr, "initworker FD_SET: ts->set result is %i\n",ts->set); } //(void) fprintf(stderr, "benchmark_initworker: after second macro/loop\n"); ts->max++; close(fid); //(void) fprintf(stderr, "benchmark_initworker: N is %i: n is %i\n",N, n); if (n != N) exit(1); /* end of initialize function */ //(void) fprintf(stderr, "benchmark_initworker: about to exit\n"); return (0); }
int main(int ac, char **av) { char c; int n, N, fd, fid; pid_t pid, ppid; char buf[L_tmpnam+256]; char fname[L_tmpnam]; char* report_file = "Select on %d fd's"; char* report_tcp = "Select on %d tcp fd's"; char* report; char* usage = "lat_select tcp|file [n]\n"; morefds(); N = 200; fname[0] = 0; pid = 0; c = 0; nfds = 0; FD_ZERO(&set); report = report_file; if (ac != 2 && ac != 3) { fprintf(stderr, usage); exit(1); } if (streq(av[1], "tcp")) { report = report_tcp; /* Create a socket for clients to connect to */ fd = tcp_server(TCP_SELECT, SOCKOPT_REUSE); if (fd <= 0) { perror("lat_select: Could not open tcp server socket"); exit(1); } /* Start server process to accept client connections */ ppid = getpid(); switch(pid = fork()) { case 0: /* child server process */ if (signal(SIGTERM, sigterm) == SIG_ERR) { perror("signal(SIGTERM, sigterm) failed"); exit(1); } FD_SET(fd, &set); while (ppid == getppid()) { int newsock = tcp_accept(fd, SOCKOPT_NONE); if (newsock >= nfds) nfds = newsock + 1; FD_SET(newsock, &set); } sigterm(SIGTERM); /* NOTREACHED */ case -1: /* error */ perror("lat_select::server(): fork() failed"); exit(1); default: break; } close(fd); fd = tcp_connect("127.0.0.1", TCP_SELECT, SOCKOPT_NONE); if (fd <= 0) { perror("lat_select: Could not open socket"); exit(1); } } else if (streq(av[1], "file")) { /* Create a temporary file for clients to open */ tmpnam(fname); fd = open(fname, O_RDWR|O_APPEND|O_CREAT, 0666); unlink(fname); if (fd <= 0) { char buf[L_tmpnam+128]; sprintf(buf, "lat_select: Could not create temp file %s", fname); perror(buf); exit(1); } } else { fprintf(stderr, usage); exit(1); } if (ac == 3) N = atoi(av[2]); for (n = 0; n < N; n++) { fid = dup(fd); if (fid == -1) break; if (fid >= nfds) nfds = fid + 1; FD_SET(fid, &set); } BENCH(doit(nfds, &set), 0); sprintf(buf, report, n); micro(buf, get_n()); for (fid = 0; fid < nfds; fid++) { if (FD_ISSET(fid, &set)) { close(fid); } } close(fd); if (pid) kill(pid, SIGTERM); exit(0); }