watcher: Check for cancellation if poll() fails with EINTR
authorMartin Willi <martin@strongswan.org>
Tue, 10 Nov 2015 08:42:46 +0000 (09:42 +0100)
committerMartin Willi <martin@strongswan.org>
Fri, 4 Dec 2015 07:01:15 +0000 (08:01 +0100)
With LinuxThreads, poll() is unfortunately no cancellation point. It seems
that poll gets woken up after cancellation, but we actively must check
for cancellation before re-entering poll to properly shut down the watcher
thread.

src/libstrongswan/processing/watcher.c

index 5b94208..b762850 100644 (file)
@@ -345,6 +345,13 @@ static job_requeue_t watch(private_watcher_t *this)
                old = thread_cancelability(TRUE);
 
                res = poll(pfd, count, -1);
+               if (res == -1 && errno == EINTR)
+               {
+                       /* LinuxThreads interrupts poll(), but does not make it a
+                        * cancellation point. Manually test if we got cancelled. */
+                       thread_cancellation_point();
+               }
+
                thread_cancelability(old);
                thread_cleanup_pop(FALSE);