Merge r6157:

- add extra fields to ThreadOSState to make thread cancellation sort-of 
  work on AIX5

- add function VG_(count_runnable_threads)


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@6288 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/pub_core_threadstate.h b/coregrind/pub_core_threadstate.h
index aa2a9ac..8b622bc 100644
--- a/coregrind/pub_core_threadstate.h
+++ b/coregrind/pub_core_threadstate.h
@@ -67,8 +67,8 @@
 typedef
    enum { 
       VgSrc_None,	 /* not exiting yet */
-      VgSrc_ExitSyscall, /* client called exit().  This is the normal
-                            route out. */
+      VgSrc_ExitThread,  /* just this thread is exiting */
+      VgSrc_ExitProcess, /* entire process is exiting */
       VgSrc_FatalSig	 /* Killed by the default action of a fatal
 			    signal */
    }
@@ -121,8 +121,22 @@
       Addr valgrind_stack_init_SP; // starting value for SP
 
       /* exit details */
-      Int exitcode; // in the case of exitgroup, set by someone else
-      Int fatalsig; // fatal signal
+      Word exitcode; // in the case of exitgroup, set by someone else
+      Int  fatalsig; // fatal signal
+
+#     if defined(VGO_aix5)
+      /* AIX specific fields to make thread cancellation sort-of work */
+      /* What is this thread's current cancellation state a la
+         POSIX (deferred vs async, enable vs disabled) ? */
+      Bool cancel_async;   // current cancel mode (async vs deferred)
+      Bool cancel_disabled; // cancellation disabled?
+      /* What's happened so far? */
+      enum { Canc_NoRequest=0, // no cancellation requested
+             Canc_Requested=1, // requested but not actioned
+             Canc_Actioned=2 } // requested and actioned
+           cancel_progress;
+      /* Initial state is False, False, Canc_Normal. */
+#     endif
    }
    ThreadOSstate;
 
@@ -238,6 +252,9 @@
 /* Return the number of non-dead Threads */
 extern Int VG_(count_living_threads)(void);
 
+/* Return the number of threads in VgTs_Runnable state */
+extern Int VG_(count_runnable_threads)(void);
+
 /* Given an LWP id (ie, real kernel thread id), find the corresponding
    ThreadId */
 extern ThreadId VG_(get_lwp_tid)(Int lwpid);