pipetest.c revision 8e914727cfa67d9fd7407970e3b694fe72824ee2
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() {
1718e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    pthread_t t1;
1728e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    pthread_t t2;
1738e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    int fd[2];
1748e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
1758e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    if (pipe(fd)) return -1;
1768e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
1778e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    pthread_create(&t1, NULL, (void *)thread_poll, (void *)fd[0]);
1788e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    pthread_create(&t2, NULL, (void *)thread_poll, (void *)fd[0]);
1798e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
1808e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    sleep(1);
1818e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
1828e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    _shutdown(fd[1], SHUT_RDWR);
1838e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
1848e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    pthread_join(t1, NULL);
1858e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    pthread_join(t2, NULL);
1868e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
1878e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly}
1888e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
1898e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic int THREADS = 100;
1908e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
1918e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic int do_close_poll_poll_poll() {
1928e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    pthread_t t[THREADS];
1938e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    int i;
1948e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    int fd[2];
1958e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
1968e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    if (pipe(fd)) return -1;
1978e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
1988e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    _close(fd[1]);
1998e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
2008e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    for (i = 0; i < THREADS; i++)
2018e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly        pthread_create(&t[i], NULL, (void *)thread_poll, (void *)fd[0]);
2028e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
2038e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    for (i = 0; i < THREADS; i++)
2048e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly        pthread_join(t[i], NULL);
2058e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
2068e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    return 0;
2078e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly}
2088e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
2098e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic int do_close_close_close() {
2108e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    pthread_t t[THREADS];
2118e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    int i;
2128e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    int fd[2];
2138e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
2148e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    if (pipe(fd)) return -1;
2158e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
2168e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    for (i = 0; i < THREADS; i++)
2178e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly        pthread_create(&t[i], NULL, (void *)thread_close, (void *)fd[i%2]);
2188e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
2198e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    return 0;
2208e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly}
2218e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
2228e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic int pipe_close_w_close_r_repeat() {
2238e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    int fd[2];
2248e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    pthread_t t;
2258e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    int i;
2268e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
2278e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    for (i = 0; i < THREADS; i++) {
2288e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly        if (pipe(fd)) return -1;
2298e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly        pthread_create(&t, NULL, (void *)thread_poll, (void *)fd[0]);
2308e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly        _close(fd[1]);
2318e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly        _close(fd[0]);
2328e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly        pthread_join(t, NULL);
2338e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    }
2348e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
2358e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    return 0;
2368e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly}
2378e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
2388e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystruct {
2398e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    char *name;
2408e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    int (*ptr)();
2418e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly} function_table[]  = {
2428e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    {"pipe_pipe_pipe", do_pipe_pipe_pipe},
2438e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    {"poll_poll_close", do_poll_poll_close},
2448e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    {"pollin_pollin_write", do_pollin_pollin_write},
2458e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    {"poll_poll_shutdown", do_poll_poll_shutdown},
2468e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    {"close_poll_poll_poll", do_close_poll_poll_poll},
2478e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    {"close_close_close", do_close_close_close},
2488e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    {"pipe_close_w_close_w_repeat", pipe_close_w_close_r_repeat},
2498e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    {NULL, NULL},
2508e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly};
2518e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
2528e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellystatic void usage() {
2538e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    int i;
2548e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
2558e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    printf("Usage:\n");
2568e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    for (i = 0; function_table[i].name; i++) {
2578e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly        printf("\tpipetest %s\n", function_table[i].name);
2588e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    }
2598e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly}
2608e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
2618e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pellyint main(int argc, char **argv) {
2628e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    int i;
2638e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly
2648e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    if (argc != 2) {
2658e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly        usage();
2668e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly        return -1;
2678e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    }
2688e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    for (i = 0; function_table[i].name; i++) {
2698e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly        if (!strcmp(argv[1], function_table[i].name)) {
2708e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly            printf("%s\n", function_table[i].name);
2718e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly            return (*function_table[i].ptr)();
2728e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly        }
2738e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    }
2748e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    usage();
2758e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly    return -1;
2768e914727cfa67d9fd7407970e3b694fe72824ee2Nick Pelly}
277