Add python-eventlet 0.16.1
[packages/trusty/python-eventlet.git] / eventlet / eventlet / green / os.py
1 os_orig = __import__("os")
2 import errno
3 socket = __import__("socket")
4
5 from eventlet import greenio
6 from eventlet.support import get_errno
7 from eventlet import greenthread
8 from eventlet import hubs
9 from eventlet.patcher import slurp_properties
10
11 __all__ = os_orig.__all__
12 __patched__ = ['fdopen', 'read', 'write', 'wait', 'waitpid', 'open']
13
14 slurp_properties(
15     os_orig,
16     globals(),
17     ignore=__patched__,
18     srckeys=dir(os_orig))
19
20
21 def fdopen(fd, *args, **kw):
22     """fdopen(fd [, mode='r' [, bufsize]]) -> file_object
23
24     Return an open file object connected to a file descriptor."""
25     if not isinstance(fd, int):
26         raise TypeError('fd should be int, not %r' % fd)
27     try:
28         return greenio.GreenPipe(fd, *args, **kw)
29     except IOError as e:
30         raise OSError(*e.args)
31
32 __original_read__ = os_orig.read
33
34
35 def read(fd, n):
36     """read(fd, buffersize) -> string
37
38     Read a file descriptor."""
39     while True:
40         try:
41             return __original_read__(fd, n)
42         except (OSError, IOError) as e:
43             if get_errno(e) != errno.EAGAIN:
44                 raise
45         except socket.error as e:
46             if get_errno(e) == errno.EPIPE:
47                 return ''
48             raise
49         try:
50             hubs.trampoline(fd, read=True)
51         except hubs.IOClosed:
52             return ''
53
54 __original_write__ = os_orig.write
55
56
57 def write(fd, st):
58     """write(fd, string) -> byteswritten
59
60     Write a string to a file descriptor.
61     """
62     while True:
63         try:
64             return __original_write__(fd, st)
65         except (OSError, IOError) as e:
66             if get_errno(e) != errno.EAGAIN:
67                 raise
68         except socket.error as e:
69             if get_errno(e) != errno.EPIPE:
70                 raise
71         hubs.trampoline(fd, write=True)
72
73
74 def wait():
75     """wait() -> (pid, status)
76
77     Wait for completion of a child process."""
78     return waitpid(0, 0)
79
80 __original_waitpid__ = os_orig.waitpid
81
82
83 def waitpid(pid, options):
84     """waitpid(...)
85     waitpid(pid, options) -> (pid, status)
86
87     Wait for completion of a given child process."""
88     if options & os_orig.WNOHANG != 0:
89         return __original_waitpid__(pid, options)
90     else:
91         new_options = options | os_orig.WNOHANG
92         while True:
93             rpid, status = __original_waitpid__(pid, new_options)
94             if rpid and status >= 0:
95                 return rpid, status
96             greenthread.sleep(0.01)
97
98 __original_open__ = os_orig.open
99
100
101 def open(file, flags, mode=0o777, dir_fd=None):
102     """ Wrap os.open
103         This behaves identically, but collaborates with
104         the hub's notify_opened protocol.
105     """
106     if dir_fd is not None:
107         fd = __original_open__(file, flags, mode, dir_fd=dir_fd)
108     else:
109         fd = __original_open__(file, flags, mode)
110     hubs.notify_opened(fd)
111     return fd