Author: rhs
Date: Mon Jul 30 23:03:46 2012
New Revision: 1367354

URL: http://svn.apache.org/viewvc?rev=1367354&view=rev
Log:
QPID-4147: made selector handle interrupt based on patch from siddesh

Modified:
    qpid/trunk/qpid/python/qpid/selector.py
    qpid/trunk/qpid/python/qpid/tests/messaging/endpoints.py

Modified: qpid/trunk/qpid/python/qpid/selector.py
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qpid/selector.py?rev=1367354&r1=1367353&r2=1367354&view=diff
==============================================================================
--- qpid/trunk/qpid/python/qpid/selector.py (original)
+++ qpid/trunk/qpid/python/qpid/selector.py Mon Jul 30 23:03:46 2012
@@ -16,7 +16,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-import atexit, time
+import atexit, time, errno
 from compat import select, set, selectable_waiter
 from threading import Thread, Lock
 
@@ -111,12 +111,24 @@ class Selector:
           else:
             wakeup = min(wakeup, t)
 
-      if wakeup is None:
-        timeout = None
-      else:
-        timeout = max(0, wakeup - time.time())
+      rd = []
+      wr = []
+      ex = []
 
-      rd, wr, ex = select(self.reading, self.writing, (), timeout)
+      while True:
+        try:
+          if wakeup is None:
+            timeout = None
+          else:
+            timeout = max(0, wakeup - time.time())
+          rd, wr, ex = select(self.reading, self.writing, (), timeout)
+          break
+        except Exception, (err, strerror):
+          # Repeat the select call if we were interrupted.
+          if err == errno.EINTR:
+            continue
+          else:
+            raise
 
       for sel in wr:
         if sel.writing():

Modified: qpid/trunk/qpid/python/qpid/tests/messaging/endpoints.py
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/python/qpid/tests/messaging/endpoints.py?rev=1367354&r1=1367353&r2=1367354&view=diff
==============================================================================
--- qpid/trunk/qpid/python/qpid/tests/messaging/endpoints.py (original)
+++ qpid/trunk/qpid/python/qpid/tests/messaging/endpoints.py Mon Jul 30 
23:03:46 2012
@@ -1333,3 +1333,15 @@ class SenderTests(Base):
     self.drain(self.rcv, expected=msgs)
     self.ssn.acknowledge()
     assert caught, "did not exceed capacity"
+
+  def testEINTR(self):
+    m1 = self.content("testEINTR", 0)
+    m2 = self.content("testEINTR", 1)
+
+    self.snd.send(m1, timeout=self.timeout())
+    try:
+      os.setuid(500)
+      assert False, "setuid should fail"
+    except:
+      pass
+    self.snd.send(m2, timeout=self.timeout())



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to