mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
os.sendfile() test: fix "AttributeError: 'NoneType' object has no attribute 'Thread'" when running tests with --without-threads option.
reference: http://bugs.python.org/issue10882#msg136257
This commit is contained in:
parent
0d38f2e65f
commit
566f8a646e
1 changed files with 74 additions and 73 deletions
|
@ -1309,89 +1309,90 @@ class ProgramPriorityTests(unittest.TestCase):
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
class SendfileTestServer(asyncore.dispatcher, threading.Thread):
|
if threading is not None:
|
||||||
|
class SendfileTestServer(asyncore.dispatcher, threading.Thread):
|
||||||
|
|
||||||
class Handler(asynchat.async_chat):
|
class Handler(asynchat.async_chat):
|
||||||
|
|
||||||
def __init__(self, conn):
|
def __init__(self, conn):
|
||||||
asynchat.async_chat.__init__(self, conn)
|
asynchat.async_chat.__init__(self, conn)
|
||||||
self.in_buffer = []
|
self.in_buffer = []
|
||||||
self.closed = False
|
self.closed = False
|
||||||
self.push(b"220 ready\r\n")
|
self.push(b"220 ready\r\n")
|
||||||
|
|
||||||
def handle_read(self):
|
def handle_read(self):
|
||||||
data = self.recv(4096)
|
data = self.recv(4096)
|
||||||
self.in_buffer.append(data)
|
self.in_buffer.append(data)
|
||||||
|
|
||||||
def get_data(self):
|
def get_data(self):
|
||||||
return b''.join(self.in_buffer)
|
return b''.join(self.in_buffer)
|
||||||
|
|
||||||
def handle_close(self):
|
def handle_close(self):
|
||||||
|
self.close()
|
||||||
|
self.closed = True
|
||||||
|
|
||||||
|
def handle_error(self):
|
||||||
|
raise
|
||||||
|
|
||||||
|
def __init__(self, address):
|
||||||
|
threading.Thread.__init__(self)
|
||||||
|
asyncore.dispatcher.__init__(self)
|
||||||
|
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
self.bind(address)
|
||||||
|
self.listen(5)
|
||||||
|
self.host, self.port = self.socket.getsockname()[:2]
|
||||||
|
self.handler_instance = None
|
||||||
|
self._active = False
|
||||||
|
self._active_lock = threading.Lock()
|
||||||
|
|
||||||
|
# --- public API
|
||||||
|
|
||||||
|
@property
|
||||||
|
def running(self):
|
||||||
|
return self._active
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
assert not self.running
|
||||||
|
self.__flag = threading.Event()
|
||||||
|
threading.Thread.start(self)
|
||||||
|
self.__flag.wait()
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
assert self.running
|
||||||
|
self._active = False
|
||||||
|
self.join()
|
||||||
|
|
||||||
|
def wait(self):
|
||||||
|
# wait for handler connection to be closed, then stop the server
|
||||||
|
while not getattr(self.handler_instance, "closed", False):
|
||||||
|
time.sleep(0.001)
|
||||||
|
self.stop()
|
||||||
|
|
||||||
|
# --- internals
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
self._active = True
|
||||||
|
self.__flag.set()
|
||||||
|
while self._active and asyncore.socket_map:
|
||||||
|
self._active_lock.acquire()
|
||||||
|
asyncore.loop(timeout=0.001, count=1)
|
||||||
|
self._active_lock.release()
|
||||||
|
asyncore.close_all()
|
||||||
|
|
||||||
|
def handle_accept(self):
|
||||||
|
conn, addr = self.accept()
|
||||||
|
self.handler_instance = self.Handler(conn)
|
||||||
|
|
||||||
|
def handle_connect(self):
|
||||||
self.close()
|
self.close()
|
||||||
self.closed = True
|
handle_read = handle_connect
|
||||||
|
|
||||||
|
def writable(self):
|
||||||
|
return 0
|
||||||
|
|
||||||
def handle_error(self):
|
def handle_error(self):
|
||||||
raise
|
raise
|
||||||
|
|
||||||
def __init__(self, address):
|
|
||||||
threading.Thread.__init__(self)
|
|
||||||
asyncore.dispatcher.__init__(self)
|
|
||||||
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
||||||
self.bind(address)
|
|
||||||
self.listen(5)
|
|
||||||
self.host, self.port = self.socket.getsockname()[:2]
|
|
||||||
self.handler_instance = None
|
|
||||||
self._active = False
|
|
||||||
self._active_lock = threading.Lock()
|
|
||||||
|
|
||||||
# --- public API
|
|
||||||
|
|
||||||
@property
|
|
||||||
def running(self):
|
|
||||||
return self._active
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
assert not self.running
|
|
||||||
self.__flag = threading.Event()
|
|
||||||
threading.Thread.start(self)
|
|
||||||
self.__flag.wait()
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
assert self.running
|
|
||||||
self._active = False
|
|
||||||
self.join()
|
|
||||||
|
|
||||||
def wait(self):
|
|
||||||
# wait for handler connection to be closed, then stop the server
|
|
||||||
while not getattr(self.handler_instance, "closed", False):
|
|
||||||
time.sleep(0.001)
|
|
||||||
self.stop()
|
|
||||||
|
|
||||||
# --- internals
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
self._active = True
|
|
||||||
self.__flag.set()
|
|
||||||
while self._active and asyncore.socket_map:
|
|
||||||
self._active_lock.acquire()
|
|
||||||
asyncore.loop(timeout=0.001, count=1)
|
|
||||||
self._active_lock.release()
|
|
||||||
asyncore.close_all()
|
|
||||||
|
|
||||||
def handle_accept(self):
|
|
||||||
conn, addr = self.accept()
|
|
||||||
self.handler_instance = self.Handler(conn)
|
|
||||||
|
|
||||||
def handle_connect(self):
|
|
||||||
self.close()
|
|
||||||
handle_read = handle_connect
|
|
||||||
|
|
||||||
def writable(self):
|
|
||||||
return 0
|
|
||||||
|
|
||||||
def handle_error(self):
|
|
||||||
raise
|
|
||||||
|
|
||||||
|
|
||||||
@unittest.skipUnless(threading is not None, "test needs threading module")
|
@unittest.skipUnless(threading is not None, "test needs threading module")
|
||||||
@unittest.skipUnless(hasattr(os, 'sendfile'), "test needs os.sendfile()")
|
@unittest.skipUnless(hasattr(os, 'sendfile'), "test needs os.sendfile()")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue