lib: reworked the Thread class in threadwrap.h to avoid pthread_cancel
commitd7816d8075ef49f158acb80493a45921f5758e01
authorChris Frey <cdfrey@foursquare.net>
Tue, 1 Nov 2011 23:12:50 +0000 (1 19:12 -0400)
committerChris Frey <cdfrey@foursquare.net>
Tue, 1 Nov 2011 23:12:50 +0000 (1 19:12 -0400)
treed4fd6fe317382abdcd9ef69f68aab7dc784175c3
parent1585e352155fbabb5d77b28577d90f22da04967e
lib: reworked the Thread class in threadwrap.h to avoid pthread_cancel

pthread_cancel is only used once in the entire library, and is not
implemented in all platforms, such as Android's Bionic.

The logic behind skipping pthread_cancel is valid, and since this is
not a heavy dependency for us, let's try to skip it.

From: http://www.netmite.com/android/mydroid/1.5/bionic/libc/docs/OVERVIEW.TXT

pthread_cancel():

   pthread_cancel() will *not* be supported in Bionic, because doing this would
   involve making the C library significantly bigger for very little benefit.

   Consider that:

     - A proper implementation must insert pthread cancellation checks in a lot
       of different places of the C library. And conformance is very difficult
       to test properly.

     - A proper implementation must also clean up resources, like releasing
       memory, or unlocking mutexes, properly if the cancellation happens in a
       complex function (e.g. inside gethostbyname() or fprintf() + complex
       formatting rules). This tends to slow down the path of many functions.

     - pthread cancellation cannot stop all threads: e.g. it can't do anything
       against an infinite loop

     - pthread cancellation itself has short-comings and isn't very portable
       (see http://advogato.org/person/slamb/diary.html?start=49 for example).

   All of this is contrary to the Bionic design goals. If your code depends on
   thread cancellation, please consider alternatives.

   Note however that Bionic does implement pthread_cleanup_push() and
   pthread_cleanup_pop(), which can be used to handle cleanups that happen when
   a thread voluntarily exits through pthread_exit() or returning from its
   main function.
src/j_server.cc
src/j_server.h
src/threadwrap.cc
src/threadwrap.h