|
@@ -1,10 +1,10 @@
|
|
-import supervisor.medusa.text_socket as socket
|
|
|
|
|
|
+import socket
|
|
|
|
|
|
class Proxy:
|
|
class Proxy:
|
|
""" Class for wrapping a shared resource object and getting
|
|
""" Class for wrapping a shared resource object and getting
|
|
notified when it's deleted
|
|
notified when it's deleted
|
|
"""
|
|
"""
|
|
-
|
|
|
|
|
|
+
|
|
def __init__(self, object, **kwargs):
|
|
def __init__(self, object, **kwargs):
|
|
self.object = object
|
|
self.object = object
|
|
self.on_delete = kwargs.get('on_delete', None)
|
|
self.on_delete = kwargs.get('on_delete', None)
|
|
@@ -12,30 +12,30 @@ class Proxy:
|
|
def __del__(self):
|
|
def __del__(self):
|
|
if self.on_delete:
|
|
if self.on_delete:
|
|
self.on_delete()
|
|
self.on_delete()
|
|
-
|
|
|
|
|
|
+
|
|
def __getattr__(self, name):
|
|
def __getattr__(self, name):
|
|
return getattr(self.object, name)
|
|
return getattr(self.object, name)
|
|
-
|
|
|
|
|
|
+
|
|
def _get(self):
|
|
def _get(self):
|
|
return self.object
|
|
return self.object
|
|
-
|
|
|
|
|
|
+
|
|
class ReferenceCounter:
|
|
class ReferenceCounter:
|
|
""" Class for tracking references to a shared resource
|
|
""" Class for tracking references to a shared resource
|
|
"""
|
|
"""
|
|
-
|
|
|
|
|
|
+
|
|
def __init__(self, **kwargs):
|
|
def __init__(self, **kwargs):
|
|
self.on_non_zero = kwargs['on_non_zero']
|
|
self.on_non_zero = kwargs['on_non_zero']
|
|
self.on_zero = kwargs['on_zero']
|
|
self.on_zero = kwargs['on_zero']
|
|
self.ref_count = 0
|
|
self.ref_count = 0
|
|
-
|
|
|
|
|
|
+
|
|
def get_count(self):
|
|
def get_count(self):
|
|
return self.ref_count
|
|
return self.ref_count
|
|
-
|
|
|
|
|
|
+
|
|
def increment(self):
|
|
def increment(self):
|
|
if self.ref_count == 0:
|
|
if self.ref_count == 0:
|
|
self.on_non_zero()
|
|
self.on_non_zero()
|
|
self.ref_count += 1
|
|
self.ref_count += 1
|
|
-
|
|
|
|
|
|
+
|
|
def decrement(self):
|
|
def decrement(self):
|
|
if self.ref_count <= 0:
|
|
if self.ref_count <= 0:
|
|
raise Exception('Illegal operation: cannot decrement below zero')
|
|
raise Exception('Illegal operation: cannot decrement below zero')
|
|
@@ -45,11 +45,11 @@ class ReferenceCounter:
|
|
|
|
|
|
class SocketManager:
|
|
class SocketManager:
|
|
""" Class for managing sockets in servers that create/bind/listen
|
|
""" Class for managing sockets in servers that create/bind/listen
|
|
- before forking multiple child processes to accept()
|
|
|
|
|
|
+ before forking multiple child processes to accept()
|
|
Sockets are managed at the process group level and referenced counted
|
|
Sockets are managed at the process group level and referenced counted
|
|
at the process level b/c that's really the only place to hook in
|
|
at the process level b/c that's really the only place to hook in
|
|
"""
|
|
"""
|
|
-
|
|
|
|
|
|
+
|
|
def __init__(self, socket_config, **kwargs):
|
|
def __init__(self, socket_config, **kwargs):
|
|
self.logger = kwargs.get('logger', None)
|
|
self.logger = kwargs.get('logger', None)
|
|
self.socket = None
|
|
self.socket = None
|
|
@@ -58,7 +58,7 @@ class SocketManager:
|
|
self.ref_ctr = ReferenceCounter(
|
|
self.ref_ctr = ReferenceCounter(
|
|
on_zero=self._close, on_non_zero=self._prepare_socket
|
|
on_zero=self._close, on_non_zero=self._prepare_socket
|
|
)
|
|
)
|
|
-
|
|
|
|
|
|
+
|
|
def __repr__(self):
|
|
def __repr__(self):
|
|
return '<%s at %s for %s>' % (self.__class__,
|
|
return '<%s at %s for %s>' % (self.__class__,
|
|
id(self),
|
|
id(self),
|
|
@@ -66,7 +66,7 @@ class SocketManager:
|
|
|
|
|
|
def config(self):
|
|
def config(self):
|
|
return self.socket_config
|
|
return self.socket_config
|
|
-
|
|
|
|
|
|
+
|
|
def is_prepared(self):
|
|
def is_prepared(self):
|
|
return self.prepared
|
|
return self.prepared
|
|
|
|
|
|
@@ -74,15 +74,15 @@ class SocketManager:
|
|
self.ref_ctr.increment()
|
|
self.ref_ctr.increment()
|
|
self._require_prepared()
|
|
self._require_prepared()
|
|
return Proxy(self.socket, on_delete=self.ref_ctr.decrement)
|
|
return Proxy(self.socket, on_delete=self.ref_ctr.decrement)
|
|
-
|
|
|
|
|
|
+
|
|
def get_socket_ref_count(self):
|
|
def get_socket_ref_count(self):
|
|
self._require_prepared()
|
|
self._require_prepared()
|
|
return self.ref_ctr.get_count()
|
|
return self.ref_ctr.get_count()
|
|
-
|
|
|
|
|
|
+
|
|
def _require_prepared(self):
|
|
def _require_prepared(self):
|
|
if not self.prepared:
|
|
if not self.prepared:
|
|
raise Exception('Socket has not been prepared')
|
|
raise Exception('Socket has not been prepared')
|
|
-
|
|
|
|
|
|
+
|
|
def _prepare_socket(self):
|
|
def _prepare_socket(self):
|
|
if not self.prepared:
|
|
if not self.prepared:
|
|
if self.logger:
|
|
if self.logger:
|