greenio: processes: None >= 0 TypeError

https://github.com/eventlet/eventlet/issues/107
This commit is contained in:
Sergey Shepelev
2014-07-16 18:15:57 +04:00
parent 2f49f860b8
commit b73399116d
3 changed files with 33 additions and 37 deletions

View File

@@ -382,32 +382,29 @@ class _SocketDuckForFd(object):
buf[:nbytes] = data
return len(data)
@staticmethod
def _try_send(fd, data, sent=0, write=os.write):
try:
sent = write(fd, data)
except OSError as e:
if get_errno(e) not in SOCKET_BLOCKING:
raise IOError(*e.args)
return sent
def send(self, data):
while True:
try:
os.write(self._fileno, data)
except OSError as e:
if get_errno(e) not in SOCKET_BLOCKING:
raise IOError(*e.args)
sent = self._try_send(self._fileno, data)
if sent == 0:
trampoline(self, write=True)
sent = self._try_send(self._fileno, data)
return sent
def sendall(self, data):
len_data = len(data)
os_write = os.write
fileno = self._fileno
try:
total_sent = os_write(fileno, data)
except OSError as e:
if get_errno(e) != errno.EAGAIN:
raise IOError(*e.args)
total_sent = 0
total_sent = self._try_send(fileno, data)
while total_sent < len_data:
trampoline(self, write=True)
try:
total_sent += os_write(fileno, data[total_sent:])
except OSError as e:
if get_errno(e) != errno. EAGAIN:
raise IOError(*e.args)
total_sent += self._try_send(fileno, data[total_sent:])
def __del__(self):
self._close()

View File

@@ -9,7 +9,7 @@ import os
import signal
import eventlet
from eventlet import greenio, pools
from eventlet import pools
from eventlet.green import subprocess
@@ -31,7 +31,7 @@ def cooperative_wait(pobj, check_interval=0.01):
try:
while True:
status = pobj.poll()
if status >= 0:
if status is not None:
return status
eventlet.sleep(check_interval)
except OSError as e:
@@ -96,7 +96,7 @@ class Process(object):
return self.child_stdin
raise RuntimeError("Unknown mode", mode)
def read(self, amount=None):
def read(self, amount=-1):
"""Reads from the stdout and stderr of the child process.
The first call to read() will return a string; subsequent
calls may raise a DeadProcess when EOF occurs on the pipe.

View File

@@ -1,11 +1,14 @@
import sys
import warnings
from tests import LimitedTestCase, main, skip_on_windows
import eventlet
warnings.simplefilter('ignore', DeprecationWarning)
from eventlet import processes, api
from eventlet import processes
warnings.simplefilter('default', DeprecationWarning)
from tests import LimitedTestCase, main, skip_on_windows
class TestEchoPool(LimitedTestCase):
def setUp(self):
super(TestEchoPool, self).setUp()
@@ -20,7 +23,7 @@ class TestEchoPool(LimitedTestCase):
result = proc.read()
finally:
self.pool.put(proc)
self.assertEqual(result, 'hello\n')
self.assertEqual(result, b'hello\n')
@skip_on_windows
def test_read_eof(self):
@@ -34,14 +37,14 @@ class TestEchoPool(LimitedTestCase):
@skip_on_windows
def test_empty_echo(self):
p = processes.Process('echo', ['-n'])
self.assertEqual('', p.read())
self.assertEqual(b'', p.read())
self.assertRaises(processes.DeadProcess, p.read)
class TestCatPool(LimitedTestCase):
def setUp(self):
super(TestCatPool, self).setUp()
api.sleep(0)
eventlet.sleep(0)
self.pool = processes.ProcessPool('cat')
@skip_on_windows
@@ -50,34 +53,30 @@ class TestCatPool(LimitedTestCase):
proc = self.pool.get()
try:
proc.write('goodbye')
proc.write(b'goodbye')
proc.close_stdin()
result = proc.read()
finally:
self.pool.put(proc)
self.assertEqual(result, 'goodbye')
self.assertEqual(result, b'goodbye')
@skip_on_windows
def test_write_to_dead(self):
result = None
proc = self.pool.get()
try:
proc.write('goodbye')
proc.write(b'goodbye')
proc.close_stdin()
result = proc.read()
proc.read()
self.assertRaises(processes.DeadProcess, proc.write, 'foo')
finally:
self.pool.put(proc)
@skip_on_windows
def test_close(self):
result = None
proc = self.pool.get()
try:
proc.write('hello')
proc.write(b'hello')
proc.close()
self.assertRaises(processes.DeadProcess, proc.write, 'goodbye')
finally:
@@ -95,7 +94,7 @@ class TestDyingProcessesLeavePool(LimitedTestCase):
try:
try:
result = proc.read()
self.assertEqual(result, 'hello\n')
self.assertEqual(result, b'hello\n')
result = proc.read()
except processes.DeadProcess:
pass