""" In order to detect a filehandle that's been closed, our only clue may be the operating system returning the same filehandle in response to some other operation. The builtins 'file' and 'open' are patched to collaborate with the notify_opened protocol. """ builtins_orig = __builtins__ from eventlet import hubs from eventlet.hubs import hub from eventlet.patcher import slurp_properties import sys __all__ = dir(builtins_orig) __patched__ = ['file', 'open'] slurp_properties(builtins_orig, globals(), ignore=__patched__, srckeys=dir(builtins_orig)) hubs.get_hub() __original_file = file class file(__original_file): def __init__(self, *args, **kwargs): super(file, self).__init__(*args, **kwargs) hubs.notify_opened(self.fileno()) __original_open = open __opening = False def open(*args): global __opening result = __original_open(*args) if not __opening: # This is incredibly ugly. 'open' is used under the hood by # the import process. So, ensure we don't wind up in an # infinite loop. __opening = True hubs.notify_opened(result.fileno()) __opening = False return result