> The bug has been fixed! There's no need to avoid multi-tasking Python > programs any more. It's fixed in python-2.6, PyGOboject 2.14.1, and > PyGTK 2.12.1. See http://dev.laptop.org/ticket/4680#comment:12 > > The [OLPC] 8.2.0 release candidates in Joyride already include those > releases of PyGObject and PyGTK, and uses python-2.5 with the bug > fix back-ported from python-2.6.
I spoke too soon. We have "fixes" in the Joyride releases, but they were never tested, and they don't work yet. See: http://dev.laptop.org/ticket/4678#comment:4 and http://bugzilla.gnome.org/show_bug.cgi?id=481569 Every multi-threaded Python GTK program in OLPC (and F9, and F10-Alpha) is still polling once a second. You can easily see this by doing strace on the sugar-shell Python process. The test in ./configure in pygobject2-2.15.1-2.fc10.src.rpm uses C to look in /usr/include/Python.h for PySignal_SetWakeupFd(). There's no such thing in the Python header files or executable, though. The patch in python-2.5.1-25.fc9.src.rpm inserts a static function in signalmodule.c, and adds it to the signal_methods table so that it's visible from Python. (The changelog says "Resolves: rhbz#427794".) But the changes are not visible from C. I also checked the F9 and F10-Alpha binaries; they're compiled without this fix. Aha! The "patch file" that F9 included is #4 from the Python bug entry here: http://bugs.python.org/issue1583 But one day later, upon request, Guido van Rossum added a simple C API as well, patching Include/pyerrors.h and adding a ten-line public PySignal_SetWakeupFd function to Modules/signalmodule.c. Those changes were just made in SVN though; not in a patch file. Those final changes, including the C API, mistakenly did not get patched into Fedora's Python-2.5.1 (neither for F9 nor for F10-Alpha). So one bug is in Fedora's Python-2.5.1; the patch file python2.6-set_wakeup_fd4.patch needs to be updated to include Guido's final version from: http://svn.python.org/view?rev=59574&view=rev The needed change in signalmodule.c is to add these 10 lines: /* C API for the same, without all the error checking */ int PySignal_SetWakeupFd(int fd) { int old_fd = wakeup_fd; if (fd < 0) fd = -1; wakeup_fd = fd; return old_fd; } plus two lines in Include/pyerrors.h: /* In signalmodule.c */ int PySignal_SetWakeupFd(int fd); There's apparently another bug in the gtk code that tries to use this facility; Gnome bug 481569 referenced above gives a litany of attempts to get this right, but it may not be there yet. Soon, if the Python in F10 and/or OLPC is fixed, and its pygobject is recompiled using that Python into a new binary package, and pygtk is fixed properly, Python multithreaded programs will stop their needless polling. We're getting very close... John Gilmore _______________________________________________ Devel mailing list [email protected] http://lists.laptop.org/listinfo/devel
