This is the mail archive of the libc-hacker@cygnus.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

A pthread patch for gdb


Hi, Ulrich,

Here is a new linuxthreads patch for gdb. There is no change for glibc.
Basically when -lpthread is used, __libc_current_sigrtmin,
__libc_current_sigrtmax and __libc_allocate_rtsig from libpthread will
override the ones in glibc.

Thanks.


-- 
H.J. Lu (hjl@gnu.org)
---
Fri Feb 12 07:49:53 1999  H.J. Lu  <hjl@gnu.org>

	* Versions (__libc_current_sigrtmin, __libc_current_sigrtmax,
	__libc_allocate_rtsig): Added to GLIBC_2.1.

	* internals.h (DEFAULT_SIG_RESTART): Removed.
	(DEFAULT_SIG_CANCEL): Removed.

	* pthread.c (init_rtsigs, __libc_current_sigrtmin,
	__libc_current_sigrtmax, __libc_allocate_rtsig): New functions.
	(__pthread_sig_restart, __pthread_sig_cancel,
	__pthread_sig_debug): Initialized.
	(pthread_initialize): Call init_rtsigs () to initialize
	real-time signals.

Index: Versions
===================================================================
RCS file: /home/work/cvs/gnu/glibc/linuxthreads/Versions,v
retrieving revision 1.1.1.2
diff -u -p -r1.1.1.2 Versions
--- Versions	1998/07/27 22:27:11	1.1.1.2
+++ Versions	1999/02/12 15:43:42
@@ -93,5 +93,9 @@ libpthread {
     pthread_getconcurrency; pthread_setconcurrency;
 
     pthread_mutexattr_gettype; pthread_mutexattr_settype;
+
+    # helper functions
+    __libc_current_sigrtmin; __libc_current_sigrtmax;
+    __libc_allocate_rtsig;
   }
 }
Index: internals.h
===================================================================
RCS file: /home/work/cvs/gnu/glibc/linuxthreads/internals.h,v
retrieving revision 1.1.1.10
diff -u -p -r1.1.1.10 internals.h
--- internals.h	1999/01/09 18:18:04	1.1.1.10
+++ internals.h	1999/02/08 01:05:18
@@ -152,11 +152,6 @@ extern int __pthread_sig_cancel;
 
 extern int __pthread_sig_debug;
 
-/* Default signals used if we don't have realtime signals */
-
-#define DEFAULT_SIG_RESTART SIGUSR1
-#define DEFAULT_SIG_CANCEL SIGUSR2
-
 /* Global array of thread handles, used for validating a thread id
    and retrieving the corresponding thread descriptor. Also used for
    mapping the available stack segments. */
Index: pthread.c
===================================================================
RCS file: /home/work/cvs/gnu/glibc/linuxthreads/pthread.c,v
retrieving revision 1.1.1.12
diff -u -p -r1.1.1.12 pthread.c
--- pthread.c	1999/02/07 17:09:08	1.1.1.12
+++ pthread.c	1999/02/12 15:51:34
@@ -146,17 +146,6 @@ const int __pthread_offsetof_descr = off
 const int __pthread_offsetof_pid = offsetof(struct _pthread_descr_struct,
                                             p_pid);
 
-/* Signal numbers used for the communication.  */
-#ifdef SIGRTMIN
-int __pthread_sig_restart;
-int __pthread_sig_cancel;
-int __pthread_sig_debug;
-#else
-int __pthread_sig_restart = DEFAULT_SIG_RESTART;
-int __pthread_sig_cancel = DEFAULT_SIG_CANCEL;
-int __pthread_sig_debug = 0;    /* disabled */
-#endif
-
 /* These variables are used by the setup code.  */
 extern int _errno;
 extern int _h_errno;
@@ -173,6 +162,104 @@ static void pthread_handle_sigrestart(in
 #endif
 static void pthread_handle_sigdebug(int sig);
 
+/* Signal numbers used for the communication.
+   In these variables we keep track of the used variables.  If the
+   platform does not support any real-time signals we will define the
+   values to some unreasonable value which will signal failing of all
+   the functions below.  */
+#ifndef __SIGRTMIN
+static int current_rtmin = -1;
+static int current_rtmax = -1;
+int __pthread_sig_restart = SIGUSR1;
+int __pthread_sig_cancel = SIGUSR2;
+int __pthread_sig_debug = 0;
+#else
+static int current_rtmin;
+static int current_rtmax;
+
+#if __SIGRTMAX - __SIGRTMIN >= 3
+int __pthread_sig_restart = __SIGRTMIN;
+int __pthread_sig_cancel = __SIGRTMIN + 1;
+int __pthread_sig_debug = __SIGRTMIN + 2;
+#else
+int __pthread_sig_restart = SIGUSR1;
+int __pthread_sig_cancel = SIGUSR2;
+int __pthread_sig_debug = 0;
+#endif
+
+static int rtsigs_initialized;
+
+#include "testrtsig.h"
+
+static void
+init_rtsigs (void)
+{
+  if (!kernel_has_rtsig ())
+    {
+      current_rtmin = -1;
+      current_rtmax = -1;
+#if __SIGRTMAX - __SIGRTMIN >= 3
+      __pthread_sig_restart = SIGUSR1;
+      __pthread_sig_cancel = SIGUSR2;
+      __pthread_sig_debug = 0;
+#endif
+    }
+  else
+    {
+#if __SIGRTMAX - __SIGRTMIN >= 3
+      current_rtmin = __SIGRTMIN + 3;
+#else
+      current_rtmin = __SIGRTMIN;
+#endif
+
+      current_rtmax = __SIGRTMAX;
+    }
+
+  rtsigs_initialized = 1;
+}
+#endif
+
+/* Return number of available real-time signal with highest priority.  */
+int
+__libc_current_sigrtmin (void)
+{
+#ifdef __SIGRTMIN
+  if (!rtsigs_initialized)
+    init_rtsigs ();
+#endif
+  return current_rtmin;
+}
+
+/* Return number of available real-time signal with lowest priority.  */
+int
+__libc_current_sigrtmax (void)
+{
+#ifdef __SIGRTMIN
+  if (!rtsigs_initialized)
+    init_rtsigs ();
+#endif
+  return current_rtmax;
+}
+
+/* Allocate real-time signal with highest/lowest available
+   priority.  Please note that we don't use a lock since we assume
+   this function to be called at program start.  */
+int
+__libc_allocate_rtsig (int high)
+{
+#ifndef __SIGRTMIN
+  return -1;
+#else
+  if (!rtsigs_initialized)
+    init_rtsigs ();
+  if (current_rtmin == -1 || current_rtmin > current_rtmax)
+    /* We don't have anymore signal available.  */
+    return -1;
+
+  return high ? current_rtmin++ : current_rtmax--;
+#endif
+}
+
 /* Initialize the pthread library.
    Initialization is split in two functions:
    - a constructor function that blocks the __pthread_sig_restart signal
@@ -219,22 +306,9 @@ static void pthread_initialize(void)
   /* The errno/h_errno variable of the main thread are the global ones.  */
   __pthread_initial_thread.p_errnop = &_errno;
   __pthread_initial_thread.p_h_errnop = &_h_errno;
-#ifdef SIGRTMIN
-  /* Allocate the signals used.  */
-  __pthread_sig_restart = __libc_allocate_rtsig (1);
-  __pthread_sig_cancel = __libc_allocate_rtsig (1);
-  __pthread_sig_debug = __libc_allocate_rtsig (1);
-  if (__pthread_sig_restart < 0 ||
-      __pthread_sig_cancel < 0 ||
-      __pthread_sig_debug < 0)
-    {
-      /* The kernel does not support real-time signals.  Use as before
-	 the available signals in the fixed set.
-         Debugging is not supported in this case. */
-      __pthread_sig_restart = DEFAULT_SIG_RESTART;
-      __pthread_sig_cancel = DEFAULT_SIG_CANCEL;
-      __pthread_sig_debug = 0;
-    }
+#ifdef __SIGRTMIN
+  /* Initialize real-time signals. */
+  init_rtsigs ();
 #endif
   /* Setup signal handlers for the initial thread.
      Since signal handlers are shared between threads, these settings


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]