pipetest.c revision 8e914727cfa67d9fd7407970e3b694fe72824ee2
14f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/* 24f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Copyright 2009 The Android Open Source Project 34f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * 44f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 54f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * you may not use this file except in compliance with the License. 64f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * You may obtain a copy of the License at 74f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * 84f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 94f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * 104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * See the License for the specific language governing permissions and 144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * limitations under the License. 154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project */ 164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/* Helper to test linux pipe's */ 184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <pthread.h> 204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <stdlib.h> 214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <stdio.h> 224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <errno.h> 234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <unistd.h> 244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <sys/poll.h> 254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <sys/socket.h> 264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void print_events(int events) { 284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (events & POLLIN) printf("POLLIN "); 294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (events & POLLPRI) printf("POLLPRI "); 304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (events & POLLOUT) printf("POLLOUT "); 314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (events & POLLERR) printf("POLLERR "); 324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (events & POLLHUP) printf("POLLHUP "); 334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (events & POLLNVAL) printf("POLLNVAL "); 344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("\n"); 354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic int _close(int fd) { 384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int ret; 394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("%d: close(%d)\n", gettid(), fd); 404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project ret = close(fd); 414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("%d: close(%d) = %d\n", gettid(), fd, ret); 424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (ret) printf("\terr %d (%s)\n", errno, strerror(errno)); 434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project return ret; 444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic int _poll(struct pollfd *ufds, nfds_t nfds, int timeout) { 474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int ret; 484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project unsigned int i; 494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("%d: poll()\n", gettid()); 504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project ret = poll(ufds, nfds, timeout); 514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("%d: poll() = %d\n", gettid(), ret); 524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (ret < 0) printf("\terr %d (%s)\n", errno, strerror(errno)); 534f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (ret > 0) { 544f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project for (i=0; i<nfds; i++) { 554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (ufds[i].revents) { 564f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("\tfd %d ", ufds[i].fd); print_events(ufds[i].revents); 574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project } 584f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project } 594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project } 604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project return ret; 614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic int _write(int fd, char *buf, int len) { 644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int ret; 654f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 664f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("%d: write(%d)\n", gettid(), fd); 674f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project ret = write(fd, buf, len); 684f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("%d: write(%d) = %d\n", gettid(), fd, ret); 694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (ret < 0) printf("\terr %d (%s)\n", errno, strerror(errno)); 704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project return ret; 724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 734f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 744f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic int _shutdown(int fd, int how) { 754f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int ret; 764f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 774f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("%d: shutdown(%d)\n", gettid(), fd); 784f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project ret = shutdown(fd, how); 794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("%d: shutdown(%d) = %d\n", gettid(), fd, ret); 804f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (ret < 0) printf("\terr %d (%s)\n", errno, strerror(errno)); 814f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 824f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project return ret; 834f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 844f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void thread_poll(void *args) { 854f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int fd = (int)args; 864f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project struct pollfd pfd; 874f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("%d: START\n", gettid()); 884f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pfd.fd = fd; 894f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pfd.events = 0; 904f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project _poll(&pfd, 1, -1); 914f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("%d: END\n", gettid()); 924f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 934f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 944f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void thread_pollin(void *args) { 954f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int fd = (int)args; 964f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project struct pollfd pfd; 974f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("%d: START\n", gettid()); 984f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pfd.fd = fd; 994f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pfd.events = POLLIN; 1004f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project _poll(&pfd, 1, -1); 1014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("%d: END\n", gettid()); 1024f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 1034f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1044f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void thread_close(void *args) { 1054f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int fd = (int)args; 1064f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("%d: START\n", gettid()); 1074f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project _close(fd); 1084f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("%d: END\n", gettid()); 1094f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 1104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic int do_poll_poll_close() { 1124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_t t1; 1134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_t t2; 1144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int fd[2]; 1154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (pipe(fd)) return -1; 1174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_create(&t1, NULL, (void *)thread_poll, NULL); 1194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_create(&t2, NULL, (void *)thread_poll, NULL); 1204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project sleep(1); 1224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project _close(fd[1]); 1244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_join(t1, NULL); 1264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_join(t2, NULL); 1274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project return 0; 1294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 1304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic int do_pipe_pipe_pipe() { 1324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int fd[2]; 1334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int i; 1344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project while (1) { 1364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (pipe(fd)) { 1374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("pipe: %s\n", strerror(errno)); 1384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project return -1; 1394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project } 1404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("%d %d\n", fd[0], fd[1]); 1414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project close(fd[0]); 1424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project close(fd[1]); 1434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project } 1444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project return 0; 1464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 1474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic int do_pollin_pollin_write() { 1484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_t t1; 1494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_t t2; 1504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int fd[2]; 1514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project char buf = 'a'; 1524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int i; 1534f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1544f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (pipe(fd)) return -1; 1554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1564f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_create(&t1, NULL, (void *)thread_pollin, (void *)fd[0]); 1574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_create(&t2, NULL, (void *)thread_pollin, (void *)fd[0]); 1584f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project sleep(1); 1604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project for (i = 0; i < 100; i++) 1624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project _write(fd[1], &buf, 1); 1634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_join(t1, NULL); 1654f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_join(t2, NULL); 1664f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1674f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project return 0; 1684f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 1694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic int do_poll_poll_shutdown() { 1714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_t t1; 1724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_t t2; 1734f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int fd[2]; 1744f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1754f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (pipe(fd)) return -1; 1764f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1774f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_create(&t1, NULL, (void *)thread_poll, (void *)fd[0]); 1784f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_create(&t2, NULL, (void *)thread_poll, (void *)fd[0]); 1794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1804f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project sleep(1); 1814f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1824f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project _shutdown(fd[1], SHUT_RDWR); 1834f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1844f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_join(t1, NULL); 1854f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_join(t2, NULL); 1864f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1874f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 1884f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1894f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic int THREADS = 100; 1904f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1914f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic int do_close_poll_poll_poll() { 1924f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_t t[THREADS]; 1934f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int i; 1944f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int fd[2]; 1954f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1964f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (pipe(fd)) return -1; 1974f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 1984f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project _close(fd[1]); 1994f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 2004f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project for (i = 0; i < THREADS; i++) 2014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_create(&t[i], NULL, (void *)thread_poll, (void *)fd[0]); 2024f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 2034f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project for (i = 0; i < THREADS; i++) 2044f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_join(t[i], NULL); 2054f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 2064f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project return 0; 2074f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 2084f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 2094f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic int do_close_close_close() { 2104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_t t[THREADS]; 2114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int i; 2124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int fd[2]; 2134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 2144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (pipe(fd)) return -1; 2154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 2164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project for (i = 0; i < THREADS; i++) 2174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_create(&t[i], NULL, (void *)thread_close, (void *)fd[i%2]); 2184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 2194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project return 0; 2204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 2214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 2224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic int pipe_close_w_close_r_repeat() { 2234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int fd[2]; 2244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_t t; 2254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int i; 2264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 2274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project for (i = 0; i < THREADS; i++) { 2284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (pipe(fd)) return -1; 2294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_create(&t, NULL, (void *)thread_poll, (void *)fd[0]); 2304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project _close(fd[1]); 2314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project _close(fd[0]); 2324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project pthread_join(t, NULL); 2334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project } 2344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 2354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project return 0; 2364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 2374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 2384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstruct { 2394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project char *name; 2404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int (*ptr)(); 2414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} function_table[] = { 2424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project {"pipe_pipe_pipe", do_pipe_pipe_pipe}, 2434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project {"poll_poll_close", do_poll_poll_close}, 2444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project {"pollin_pollin_write", do_pollin_pollin_write}, 2454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project {"poll_poll_shutdown", do_poll_poll_shutdown}, 2464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project {"close_poll_poll_poll", do_close_poll_poll_poll}, 2474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project {"close_close_close", do_close_close_close}, 2484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project {"pipe_close_w_close_w_repeat", pipe_close_w_close_r_repeat}, 2494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project {NULL, NULL}, 2504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project}; 2514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 2524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectstatic void usage() { 2534f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int i; 2544f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 2554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("Usage:\n"); 2564f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project for (i = 0; function_table[i].name; i++) { 2574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("\tpipetest %s\n", function_table[i].name); 2584f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project } 2594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 2604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 2614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectint main(int argc, char **argv) { 2624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project int i; 2634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project 2644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (argc != 2) { 2654f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project usage(); 2664f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project return -1; 2674f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project } 2684f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project for (i = 0; function_table[i].name; i++) { 2694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project if (!strcmp(argv[1], function_table[i].name)) { 2704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project printf("%s\n", function_table[i].name); 2714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project return (*function_table[i].ptr)(); 2724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project } 2734f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project } 2744f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project usage(); 2754f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project return -1; 2764f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} 2774f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project