[FIX] correct socket closing
lp bug: https://launchpad.net/bugs/574874 fixed bzr revid: chs@openerp.com-20100518154123-omus9gdr04zts4j0
This commit is contained in:
parent
c146c020be
commit
63355adfc3
|
@ -24,9 +24,11 @@
|
|||
#
|
||||
##############################################################################
|
||||
|
||||
import errno
|
||||
import logging
|
||||
import logging.handlers
|
||||
import os
|
||||
import socket
|
||||
import sys
|
||||
import threading
|
||||
import time
|
||||
|
@ -358,6 +360,21 @@ class Server:
|
|||
res.extend(srv.stats() for srv in cls.__servers)
|
||||
return '\n'.join(res)
|
||||
|
||||
def _close_socket(self):
|
||||
if os.name != 'nt':
|
||||
try:
|
||||
self.socket.shutdown(getattr(socket, 'SHUT_RDWR', 2))
|
||||
except socket.error, e:
|
||||
if e.errno != errno.ENOTCONN: raise
|
||||
# OSX, socket shutdowns both sides if any side closes it
|
||||
# causing an error 57 'Socket is not connected' on shutdown
|
||||
# of the other side (or something), see
|
||||
# http://bugs.python.org/issue4397
|
||||
self.__logger.debug(
|
||||
'"%s" when shutting down server socket, '
|
||||
'this is normal under OS X', e)
|
||||
self.socket.close()
|
||||
|
||||
class OpenERPDispatcherException(Exception):
|
||||
def __init__(self, exception, traceback):
|
||||
self.exception = exception
|
||||
|
|
|
@ -31,9 +31,11 @@
|
|||
"""
|
||||
from websrv_lib import *
|
||||
import netsvc
|
||||
import errno
|
||||
import threading
|
||||
import tools
|
||||
import os
|
||||
import select
|
||||
import socket
|
||||
import xmlrpclib
|
||||
|
||||
|
@ -128,31 +130,25 @@ class BaseHttpDaemon(threading.Thread, netsvc.Server):
|
|||
"Error occur when starting the server daemon: %s" % (e,))
|
||||
raise
|
||||
|
||||
@property
|
||||
def socket(self):
|
||||
return self.server.socket
|
||||
|
||||
def attach(self, path, gw):
|
||||
pass
|
||||
|
||||
def stop(self):
|
||||
self.running = False
|
||||
if os.name != 'nt':
|
||||
try:
|
||||
self.server.socket.shutdown(
|
||||
getattr(socket, 'SHUT_RDWR', 2))
|
||||
except socket.error, e:
|
||||
if e.errno != 57: raise
|
||||
# OSX, socket shutdowns both sides if any side closes it
|
||||
# causing an error 57 'Socket is not connected' on shutdown
|
||||
# of the other side (or something), see
|
||||
# http://bugs.python.org/issue4397
|
||||
netsvc.Logger().notifyChannel(
|
||||
'server', netsvc.LOG_DEBUG,
|
||||
'"%s" when shutting down server socket, '
|
||||
'this is normal under OS X'%e)
|
||||
self.server.socket.close()
|
||||
self._close_socket()
|
||||
|
||||
def run(self):
|
||||
self.running = True
|
||||
while self.running:
|
||||
self.server.handle_request()
|
||||
try:
|
||||
self.server.handle_request()
|
||||
except (socket.error, select.error), e:
|
||||
if self.running or e.args[0] != errno.EBADF:
|
||||
raise
|
||||
return True
|
||||
|
||||
class HttpDaemon(BaseHttpDaemon):
|
||||
|
|
|
@ -27,6 +27,7 @@ import netsvc
|
|||
import threading
|
||||
import tools
|
||||
import os
|
||||
import select
|
||||
import socket
|
||||
|
||||
import tiny_socket
|
||||
|
@ -50,7 +51,6 @@ class TinySocketClientThread(threading.Thread, netsvc.OpenERPDispatcher):
|
|||
self.sock = None
|
||||
|
||||
def run(self):
|
||||
# import select
|
||||
self.running = True
|
||||
try:
|
||||
ts = tiny_socket.mysocket(self.sock)
|
||||
|
@ -103,10 +103,13 @@ class TinySocketServerThread(threading.Thread,netsvc.Server):
|
|||
"starting NET-RPC service at %s port %d" % (interface or '0.0.0.0', port,))
|
||||
|
||||
def run(self):
|
||||
# import select
|
||||
try:
|
||||
self.running = True
|
||||
while self.running:
|
||||
timeout = self.socket.gettimeout()
|
||||
fd_sets = select.select([self.socket], [], [], timeout)
|
||||
if not fd_sets[0]:
|
||||
continue
|
||||
(clientsocket, address) = self.socket.accept()
|
||||
ct = TinySocketClientThread(clientsocket, self.threads)
|
||||
clientsocket = None
|
||||
|
@ -129,12 +132,7 @@ class TinySocketServerThread(threading.Thread,netsvc.Server):
|
|||
self.running = False
|
||||
for t in self.threads:
|
||||
t.stop()
|
||||
try:
|
||||
self.socket.shutdown(
|
||||
getattr(socket, 'SHUT_RDWR', 2))
|
||||
self.socket.close()
|
||||
except:
|
||||
return False
|
||||
self._close_socket()
|
||||
|
||||
def stats(self):
|
||||
res = "Net-RPC: " + ( (self.running and "running") or "stopped")
|
||||
|
|
Loading…
Reference in New Issue