Price of the portability

Misc

  • Timers: PEP 418

  • Inheritance of file descriptors and handles: PEP 446 (and PEP 433)

  • Timezone

  • SSL/TLS x509 root certificates

  • use recent OS features: detected in configure, detected at runtime

  • doc: “Availability: xxx”

  • os.confstr(), os.sysconf()

  • os.sysconf(“SC_PAGESIZE”)

  • os.cpucount()

  • OSError, VMSError, WindowsError, IOError => OSError

  • os.closerange()

  • os.sendfile(): different API depending on the OS!

  • time.strftime()

  • tzdata

POSIX vs real world

  • Linux adds many new features not part of the POSIX standards

  • (Systemd uses new Linux-only features like cgroups, not portable on FreeBSD, OpenBSD, etc.)

  • _GNU_SOURCE: asprintf(), canonicalize_file_name()

  • realpath(NULL)

  • “Undefined” parts of POSIX standards: kept for efficiency?

  • AIX

Windows

  • POSIX API

  • POSIX API has fewer features

  • Windows console

  • Windows ANSI, OEM and console code pages

  • Atomic rename file, os.replace()

  • One binary for all Windows versions: use LoadLibrary()

  • os.fsencode() error handler and Windows versions

  • Socket: no file descriptor, SOCKET_T

UNIX

  • accept4() returns ENOSYS

  • open(O_CLOEXEC) and socket(SOCK_CLOEXEC) on old Linux kernels

select, pipes

  • test_signal: “OS doesn’t report write() error on the read end of a pipe”

  • select() limited to sockets on Windows

  • select(), poll(), epoll(), devpoll(), kqueue(), etc. => selectors => asyncio

  • async I/O operations: no Python API yet?

  • select.poll()

    • ifdef HAVE_BROKEN_POLL

    • #ifdef __APPLE__ select_have_broken_poll()

Threads and signals

  • Hard

    • low-level OS functions, syscalls

    • threads

    • signals

    • fork, exec

  • many tests skipped on old versions of operating systems

  • OpenBSD older than 5.2 implemented threads in user-space

  • FreeBSD older than 7.0

    • “Issue #12392 and #12469: send a signal to the main thread doesn’t work before the creation of the first thread on FreeBSD 6”

  • “Issue #18238: sigwaitinfo() can be interrupted on Linux (raises InterruptedError), but not on AIX”

  • Signal orders

  • HP-UX11

  • depending on the OS, a signal sent to the pid is received by the mainthread or a random thread

  • timeout on locks: drop support for thread APIs different than pthread and nt

  • pthread_sigmask()

  • pthread_kill()