rpc: If the socket is closed by peer, endpoint stop the serve.

If client does socket.close() the serve will be non-wait looping.
So must stop the serve of endpoint that received 0 byte packet.

Signed-off-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
yuta-hamada 2013-11-28 14:30:01 +09:00 committed by FUJITA Tomonori
parent 03ac8742f4
commit e8962c296e

View File

@ -115,6 +115,7 @@ class EndPoint(object):
self._notifications = deque()
self._responses = {}
self._incoming = 0 # number of incoming messages in our queues
self.closed_by_peer = False
def selectable(self):
rlist = [self._sock]
@ -142,7 +143,7 @@ class EndPoint(object):
select.select(rlist, wlist, rlist + wlist)
def serve(self):
while True:
while not self.closed_by_peer:
self.block()
self.process()
@ -182,6 +183,9 @@ class EndPoint(object):
except IOError:
packet = None
if not packet:
if packet is not None:
# socket closed by peer
self.closed_by_peer = True
break
self._encoder.get_and_dispatch_messages(packet, self._table)
return self._incoming > 0