| 1 | #!/usr/bin/env bash
 | 
| 2 | #
 | 
| 3 | # Test out our modifications to posixmodule.c to handle EINTR.
 | 
| 4 | #
 | 
| 5 | # Usage:
 | 
| 6 | #   ./eintr.sh <function name>
 | 
| 7 | 
 | 
| 8 | set -o nounset
 | 
| 9 | set -o pipefail
 | 
| 10 | set -o errexit
 | 
| 11 | 
 | 
| 12 | posix-test() {
 | 
| 13 |   PYTHONPATH=.:vendor EINTR_TEST=1 \
 | 
| 14 |     pyext/posix_test.py "$@"
 | 
| 15 | }
 | 
| 16 | 
 | 
| 17 | test-read() { posix-test PosixTest.testRead; }
 | 
| 18 | test-wait() { posix-test PosixTest.testWait; }
 | 
| 19 | test-waitpid() { posix-test PosixTest.testWaitpid; }
 | 
| 20 | test-write() { posix-test PosixTest.testWrite; }
 | 
| 21 | 
 | 
| 22 | # Conclusion: print CAN raise IOError with EINTR.
 | 
| 23 | #
 | 
| 24 | # It might be better to make our own functions:
 | 
| 25 | #
 | 
| 26 | # io.echo()  # print()
 | 
| 27 | # io.log()   # print() to stderr
 | 
| 28 | 
 | 
| 29 | # NOTE: print() is a complicated function that ends up looking up
 | 
| 30 | # sys.stdout.write().  So fixing write should fix print!
 | 
| 31 | # But for simplicity, we could still get rid of print().  It's a complicated
 | 
| 32 | # function with too many args.
 | 
| 33 | 
 | 
| 34 | test-print() { posix-test PosixTest.testPrint; }
 | 
| 35 | 
 | 
| 36 | # NOTES:
 | 
| 37 | #
 | 
| 38 | # - PEP 475 says that Python purposesly ignores EINTR on close() and dup2().
 | 
| 39 | #   The reason is due to multi-threaded programs: close() and dup2() change
 | 
| 40 | #   the descriptor table, so another thread could have reused the file
 | 
| 41 | #   descriptor in that time!  This doesn't apply to the shell, so maybe we
 | 
| 42 | #   should handle them?
 | 
| 43 | 
 | 
| 44 | # - The parts of fcntl() we use don't appear to return EINTR.  Not covered by
 | 
| 45 | #   PEP 475.
 | 
| 46 | 
 | 
| 47 | "$@"
 |