pipetest.c revision 07e2e433c27fb8c0bebe2b6b2f0865f3314aaeca
18e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly/* 28e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly * Copyright 2009 The Android Open Source Project 38e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly * 48e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly * Licensed under the Apache License, Version 2.0 (the "License"); 58e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly * you may not use this file except in compliance with the License. 68e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly * You may obtain a copy of the License at 78e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly * 88e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly * http://www.apache.org/licenses/LICENSE-2.0 98e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly * 108e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly * Unless required by applicable law or agreed to in writing, software 118e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly * distributed under the License is distributed on an "AS IS" BASIS, 128e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly * See the License for the specific language governing permissions and 148e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly * limitations under the License. 158e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly */ 168e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 178e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly/* Helper to test linux pipe's */ 188e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 198e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly#include <pthread.h> 208e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly#include <stdlib.h> 218e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly#include <stdio.h> 228e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly#include <errno.h> 238e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly#include <unistd.h> 248e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly#include <sys/poll.h> 258e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly#include <sys/socket.h> 268e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 278e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic void print_events(int events) { 288e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (events & POLLIN) printf("POLLIN "); 298e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (events & POLLPRI) printf("POLLPRI "); 308e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (events & POLLOUT) printf("POLLOUT "); 318e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (events & POLLERR) printf("POLLERR "); 328e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (events & POLLHUP) printf("POLLHUP "); 338e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (events & POLLNVAL) printf("POLLNVAL "); 348e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("\n"); 358e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 368e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 378e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic int _close(int fd) { 388e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int ret; 398e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("%d: close(%d)\n", gettid(), fd); 408e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly ret = close(fd); 418e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("%d: close(%d) = %d\n", gettid(), fd, ret); 428e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (ret) printf("\terr %d (%s)\n", errno, strerror(errno)); 438e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly return ret; 448e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 458e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 468e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic int _poll(struct pollfd *ufds, nfds_t nfds, int timeout) { 478e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int ret; 488e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly unsigned int i; 498e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("%d: poll()\n", gettid()); 508e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly ret = poll(ufds, nfds, timeout); 518e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("%d: poll() = %d\n", gettid(), ret); 528e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (ret < 0) printf("\terr %d (%s)\n", errno, strerror(errno)); 538e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (ret > 0) { 548e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly for (i=0; i<nfds; i++) { 558e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (ufds[i].revents) { 568e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("\tfd %d ", ufds[i].fd); print_events(ufds[i].revents); 578e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly } 588e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly } 598e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly } 608e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly return ret; 618e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 628e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 638e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic int _write(int fd, char *buf, int len) { 648e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int ret; 658e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 668e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("%d: write(%d)\n", gettid(), fd); 678e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly ret = write(fd, buf, len); 688e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("%d: write(%d) = %d\n", gettid(), fd, ret); 698e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (ret < 0) printf("\terr %d (%s)\n", errno, strerror(errno)); 708e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 718e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly return ret; 728e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 738e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 748e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic int _shutdown(int fd, int how) { 758e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int ret; 768e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 778e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("%d: shutdown(%d)\n", gettid(), fd); 788e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly ret = shutdown(fd, how); 798e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("%d: shutdown(%d) = %d\n", gettid(), fd, ret); 808e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (ret < 0) printf("\terr %d (%s)\n", errno, strerror(errno)); 818e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 828e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly return ret; 838e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 848e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic void thread_poll(void *args) { 858e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int fd = (int)args; 868e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly struct pollfd pfd; 878e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("%d: START\n", gettid()); 888e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pfd.fd = fd; 898e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pfd.events = 0; 908e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly _poll(&pfd, 1, -1); 918e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("%d: END\n", gettid()); 928e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 938e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 948e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic void thread_pollin(void *args) { 958e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int fd = (int)args; 968e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly struct pollfd pfd; 978e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("%d: START\n", gettid()); 988e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pfd.fd = fd; 998e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pfd.events = POLLIN; 1008e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly _poll(&pfd, 1, -1); 1018e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("%d: END\n", gettid()); 1028e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 1038e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1048e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic void thread_close(void *args) { 1058e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int fd = (int)args; 1068e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("%d: START\n", gettid()); 1078e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly _close(fd); 1088e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("%d: END\n", gettid()); 1098e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 1108e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1118e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic int do_poll_poll_close() { 1128e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_t t1; 1138e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_t t2; 1148e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int fd[2]; 1158e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1168e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (pipe(fd)) return -1; 1178e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1188e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_create(&t1, NULL, (void *)thread_poll, NULL); 1198e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_create(&t2, NULL, (void *)thread_poll, NULL); 1208e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1218e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly sleep(1); 1228e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1238e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly _close(fd[1]); 1248e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1258e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_join(t1, NULL); 1268e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_join(t2, NULL); 1278e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1288e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly return 0; 1298e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 1308e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1318e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic int do_pipe_pipe_pipe() { 1328e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int fd[2]; 1338e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int i; 1348e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1358e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly while (1) { 1368e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (pipe(fd)) { 1378e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("pipe: %s\n", strerror(errno)); 1388e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly return -1; 1398e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly } 1408e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("%d %d\n", fd[0], fd[1]); 1418e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly close(fd[0]); 1428e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly close(fd[1]); 1438e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly } 1448e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1458e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly return 0; 1468e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 1478e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic int do_pollin_pollin_write() { 1488e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_t t1; 1498e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_t t2; 1508e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int fd[2]; 1518e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly char buf = 'a'; 1528e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int i; 1538e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1548e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (pipe(fd)) return -1; 1558e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1568e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_create(&t1, NULL, (void *)thread_pollin, (void *)fd[0]); 1578e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_create(&t2, NULL, (void *)thread_pollin, (void *)fd[0]); 1588e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1598e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly sleep(1); 1608e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1618e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly for (i = 0; i < 100; i++) 1628e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly _write(fd[1], &buf, 1); 1638e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1648e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_join(t1, NULL); 1658e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_join(t2, NULL); 1668e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1678e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly return 0; 1688e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 1698e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1708e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic int do_poll_poll_shutdown() { 17107e2e433c27fb8c0bebe2b6b2f0865f3314aaecaNick Pelly#if 0 1728e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_t t1; 1738e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_t t2; 1748e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int fd[2]; 1758e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1768e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (pipe(fd)) return -1; 1778e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1788e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_create(&t1, NULL, (void *)thread_poll, (void *)fd[0]); 1798e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_create(&t2, NULL, (void *)thread_poll, (void *)fd[0]); 1808e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1818e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly sleep(1); 1828e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1838e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly _shutdown(fd[1], SHUT_RDWR); 1848e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1858e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_join(t1, NULL); 1868e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_join(t2, NULL); 18707e2e433c27fb8c0bebe2b6b2f0865f3314aaecaNick Pelly#endif 1888e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 18907e2e433c27fb8c0bebe2b6b2f0865f3314aaecaNick Pelly return -1; 1908e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 1918e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1928e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic int THREADS = 100; 1938e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1948e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic int do_close_poll_poll_poll() { 1958e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_t t[THREADS]; 1968e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int i; 1978e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int fd[2]; 1988e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 1998e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (pipe(fd)) return -1; 2008e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 2018e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly _close(fd[1]); 2028e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 2038e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly for (i = 0; i < THREADS; i++) 2048e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_create(&t[i], NULL, (void *)thread_poll, (void *)fd[0]); 2058e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 2068e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly for (i = 0; i < THREADS; i++) 2078e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_join(t[i], NULL); 2088e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 2098e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly return 0; 2108e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 2118e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 2128e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic int do_close_close_close() { 2138e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_t t[THREADS]; 2148e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int i; 2158e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int fd[2]; 2168e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 2178e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (pipe(fd)) return -1; 2188e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 2198e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly for (i = 0; i < THREADS; i++) 2208e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_create(&t[i], NULL, (void *)thread_close, (void *)fd[i%2]); 2218e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 2228e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly return 0; 2238e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 2248e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 2258e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic int pipe_close_w_close_r_repeat() { 2268e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int fd[2]; 2278e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_t t; 2288e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int i; 2298e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 2308e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly for (i = 0; i < THREADS; i++) { 2318e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (pipe(fd)) return -1; 2328e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_create(&t, NULL, (void *)thread_poll, (void *)fd[0]); 2338e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly _close(fd[1]); 2348e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly _close(fd[0]); 2358e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly pthread_join(t, NULL); 2368e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly } 2378e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 2388e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly return 0; 2398e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 2408e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 2418e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystruct { 2428e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly char *name; 2438e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int (*ptr)(); 2448e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} function_table[] = { 2458e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly {"pipe_pipe_pipe", do_pipe_pipe_pipe}, 2468e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly {"poll_poll_close", do_poll_poll_close}, 2478e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly {"pollin_pollin_write", do_pollin_pollin_write}, 2488e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly {"poll_poll_shutdown", do_poll_poll_shutdown}, 2498e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly {"close_poll_poll_poll", do_close_poll_poll_poll}, 2508e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly {"close_close_close", do_close_close_close}, 2518e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly {"pipe_close_w_close_w_repeat", pipe_close_w_close_r_repeat}, 2528e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly {NULL, NULL}, 2538e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly}; 2548e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 2558e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic void usage() { 2568e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int i; 2578e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 2588e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("Usage:\n"); 2598e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly for (i = 0; function_table[i].name; i++) { 2608e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("\tpipetest %s\n", function_table[i].name); 2618e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly } 2628e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 2638e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 2648e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellyint main(int argc, char **argv) { 2658e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly int i; 2668e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly 2678e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (argc != 2) { 2688e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly usage(); 2698e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly return -1; 2708e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly } 2718e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly for (i = 0; function_table[i].name; i++) { 2728e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly if (!strcmp(argv[1], function_table[i].name)) { 2738e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly printf("%s\n", function_table[i].name); 2748e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly return (*function_table[i].ptr)(); 2758e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly } 2768e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly } 2778e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly usage(); 2788e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly return -1; 2798e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} 280