summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Gordon <charles.gordon@gmail.com>2015-04-15 16:31:24 -0700
committerCharles Gordon <charles.gordon@gmail.com>2015-04-15 16:31:24 -0700
commitb7ba927d9761bbdb2bc9430b550c08d62b8ef015 (patch)
tree52a13ed042eaa6b06dc9867c72b761bd7bc63558
parentbdc7b3e6b6527123b3fd6ba98dfc5127fc004a24 (diff)
parent3fd7065a18bdb911c0693083d968a3771ce4cad6 (diff)
downloadpymemcache-b7ba927d9761bbdb2bc9430b550c08d62b8ef015.tar.gz
Merge pull request #39 from harlowja/no-lock-destroy
Run 'after_remove' callback outside of lock
-rw-r--r--pymemcache/pool.py24
1 files changed, 15 insertions, 9 deletions
diff --git a/pymemcache/pool.py b/pymemcache/pool.py
index 73528de..c341ceb 100644
--- a/pymemcache/pool.py
+++ b/pymemcache/pool.py
@@ -74,14 +74,16 @@ class ObjectPool(object):
return obj
def destroy(self, obj, silent=True):
+ was_dropped = False
with self._lock:
try:
self._used_objs.remove(obj)
- if self._after_remove is not None:
- self._after_remove(obj)
+ was_dropped = True
except ValueError:
if not silent:
raise
+ if was_dropped and self._after_remove is not None:
+ self._after_remove(obj)
def release(self, obj, silent=True):
with self._lock:
@@ -93,12 +95,16 @@ class ObjectPool(object):
raise
def clear(self):
- with self._lock:
- if self._after_remove is not None:
- while self._used_objs:
- self._after_remove(self._used_objs.pop())
- while self._free_objs:
- self._after_remove(self._free_objs.pop())
- else:
+ if self._after_remove is not None:
+ needs_destroy = []
+ with self._lock:
+ needs_destroy.extend(self._used_objs)
+ needs_destroy.extend(self._free_objs)
+ self._free_objs.clear()
+ self._used_objs.clear()
+ for obj in needs_destroy:
+ self._after_remove(obj)
+ else:
+ with self._lock:
self._free_objs.clear()
self._used_objs.clear()