| 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 | "$@"
|