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