diff --git a/lib/locking.py b/lib/locking.py
index 56d2d93ed59a598836e85108508ebd0f41889bc0..2f41d471fbc413c4fd6c85c44fd41cdf5ba6ba34 100644
--- a/lib/locking.py
+++ b/lib/locking.py
@@ -153,6 +153,41 @@ class SharedLock:
 
     assert self.__npass_shr == 0, "SharedLock: internal fairness violation"
 
+  def __shared_acquire(self):
+    """Acquire the lock in shared mode
+
+    This is a private function that presumes you are already holding the
+    internal lock.
+
+    """
+    self.__nwait_shr += 1
+    try:
+      wait = False
+      # If there is an exclusive holder waiting we have to wait.
+      # We'll only do this once, though, when we start waiting for
+      # the lock. Then we'll just wait while there are no
+      # exclusive holders.
+      if self.__nwait_exc > 0:
+        # TODO: if !blocking...
+        wait = True
+        self.__wait(self.__turn_shr)
+
+      while self.__exc is not None:
+        wait = True
+        # TODO: if !blocking...
+        self.__wait(self.__turn_shr)
+
+      self.__shr.add(threading.currentThread())
+
+      # If we were waiting note that we passed
+      if wait:
+        self.__npass_shr -= 1
+
+    finally:
+      self.__nwait_shr -= 1
+
+    assert self.__npass_shr >= 0, "Internal fairness condition weirdness"
+
   def acquire(self, blocking=1, shared=0):
     """Acquire a shared lock.
 
@@ -176,33 +211,7 @@ class SharedLock:
       assert self.__npass_shr >= 0, "Internal fairness condition weirdness"
 
       if shared:
-        self.__nwait_shr += 1
-        try:
-          wait = False
-          # If there is an exclusive holder waiting we have to wait.
-          # We'll only do this once, though, when we start waiting for
-          # the lock. Then we'll just wait while there are no
-          # exclusive holders.
-          if self.__nwait_exc > 0:
-            # TODO: if !blocking...
-            wait = True
-            self.__wait(self.__turn_shr)
-
-          while self.__exc is not None:
-            wait = True
-            # TODO: if !blocking...
-            self.__wait(self.__turn_shr)
-
-          self.__shr.add(threading.currentThread())
-
-          # If we were waiting note that we passed
-          if wait:
-            self.__npass_shr -= 1
-
-        finally:
-          self.__nwait_shr -= 1
-
-        assert self.__npass_shr >= 0, "Internal fairness condition weirdness"
+        self.__shared_acquire()
       else:
         # TODO: if !blocking...
         # (or modify __exclusive_acquire for non-blocking mode)
@@ -353,7 +362,6 @@ class LockSet:
       else:
         self.__owners[threading.currentThread()] = set([name])
 
-
   def _del_owned(self, name=None):
     """Note the current thread owns the given lock"""