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

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Use Roland's gen-as-const-headers in linuxthreads and nptl


Hi!

Tested on IA-32 (FLOATING_STACKS, non-FLOATING_STACKS, --with-tls
and without), x86-64, IA-64.

2002-12-28  Jakub Jelinek  <jakub@redhat.com>

linuxthreads/
	* libc_pthread_init.c (__libc_pthread_init): Remove
	MULTIPLE_THREADS_OFFSET check.
	* sysdeps/i386/tls.h: Include tcb-offsets.h in assembler.
	(SYSINFO_OFFSET): Remove.
	* sysdeps/i386/Makefile [csu] (gen-as-const-headers): Add
	tcb-offsets.sym.
	* sysdeps/i386/tcb-offsets.sym: New file.
	* sysdeps/pthread/tcb-offsets.h: New file.
	* sysdeps/sparc/sparc32/tls.h: Removed.
	* sysdeps/sparc/sparc64/tls.h: Move...
	* sysdeps/sparc/tls.h: ...here.  Include tcb-offsets.h in assembler.
	* sysdeps/sparc/Makefile: New file.
	* sysdeps/sparc/tcb-offsets.sym: New file.
	* sysdeps/ia64/tls.h: Include tcb-offsets.h in assembler.
	* sysdeps/ia64/Makefile: New file.
	* sysdeps/ia64/tcb-offsets.sym: New file.
	* sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
	(MULTIPLE_THREADS_OFFSET): Remove.
	Replace defined MULTIPLE_THREADS_OFFSET
	with defined FLOATING_STACKS && USE___THREAD.
	* sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
	(MULTIPLE_THREADS_OFFSET): Remove.
	* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
	(MULTIPLE_THREADS_OFFSET): Remove.
	* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
	(MULTIPLE_THREADS_OFFSET): Remove.
	* pthread.c (__pthread_initialize_manager): Remove
	MULTIPLE_THREADS_OFFSET cbeck.

	* tst-cancel-wrappers.sh: Add line continuations.
nptl/
	* sysdeps/i386/tls.h: Include tcb-offsets.h in assembler.
	(SYSINFO_OFFSET, MULTIPLE_THREADS_OFFSET): Remove.
	* sysdeps/i386/Makefile: New file.
	* sysdeps/i386/tcb-offsets.sym: New file.
	* sysdeps/pthread/tcb-offsets.h: New file.
	* sysdeps/unix/sysv/linux/libc_pthread_init.c (__libc_pthread_init):
	Remove MULTIPLE_THREADS_OFFSET and SYSINFO_OFFSET checks.

	* sysdeps/unix/sysv/linux/Versions [libc] (GLIBC_PRIVATE): Move
	__register_atfork...
	(GLIBC_2.3.2): ...here.

--- libc/linuxthreads/libc_pthread_init.c.jj	2002-12-28 12:29:34.000000000 +0100
+++ libc/linuxthreads/libc_pthread_init.c	2002-12-28 16:13:54.000000000 +0100
@@ -36,14 +36,6 @@ __libc_pthread_init (functions)
 	  sizeof (__libc_pthread_functions));
 #endif
 
-#ifdef MULTIPLE_THREADS_OFFSET
-  /* We have a macro which is used in asm code describing data layout.
-     Make sure it does not get out of date.  */
-  if (offsetof (struct _pthread_descr_struct, p_header.data.multiple_threads)
-      != MULTIPLE_THREADS_OFFSET)
-    abort ();
-#endif
-
 #if !(USE_TLS && HAVE___THREAD)
   /* Initialize thread-locale current locale to point to the global one.
      With __thread support, the variable's initializer takes care of this.  */
--- libc/linuxthreads/sysdeps/i386/tls.h.jj	2002-12-28 12:35:58.000000000 +0100
+++ libc/linuxthreads/sysdeps/i386/tls.h	2002-12-28 16:13:53.000000000 +0100
@@ -46,11 +46,9 @@ typedef struct
   uintptr_t sysinfo;
 #endif
 } tcbhead_t;
-#endif
 
-#ifdef NEED_DL_SYSINFO
-/* Offset of the SYSINFO element in tcbhead_t.  */
-# define SYSINFO_OFFSET 24
+#else /* __ASSEMBLER__ */
+# include <tcb-offsets.h>
 #endif
 
 /* We can support TLS only if the floating-stack support is available.
--- libc/linuxthreads/sysdeps/i386/Makefile.jj	2002-11-05 23:10:13.000000000 +0100
+++ libc/linuxthreads/sysdeps/i386/Makefile	2002-12-28 16:13:53.000000000 +0100
@@ -16,3 +16,7 @@ CFLAGS-ptlongjmp.c += -fno-omit-frame-po
 CFLAGS-semaphore.c += -fno-omit-frame-pointer
 CFLAGS-sighandler.c += -fno-omit-frame-pointer
 endif
+
+ifeq ($(subdir),csu)
+gen-as-const-headers += tcb-offsets.sym
+endif
--- libc/linuxthreads/sysdeps/i386/tcb-offsets.sym.jj	2002-12-28 16:13:53.000000000 +0100
+++ libc/linuxthreads/sysdeps/i386/tcb-offsets.sym	2002-12-28 16:13:53.000000000 +0100
@@ -0,0 +1,7 @@
+#include <sysdep.h>
+#include <tls.h>
+
+MULTIPLE_THREADS_OFFSET		offsetof (tcbhead_t, multiple_threads)
+#ifdef NEED_DL_SYSINFO
+SYSINFO_OFFSET			offsetof (tcbhead_t, sysinfo)
+#endif
--- libc/linuxthreads/sysdeps/pthread/tcb-offsets.h.jj	2002-12-28 16:49:14.000000000 +0100
+++ libc/linuxthreads/sysdeps/pthread/tcb-offsets.h	2002-12-28 16:49:05.000000000 +0100
@@ -0,0 +1 @@
+/* This is overridden by generated tcb-offsets.h on arches which need it.  */
--- libc/linuxthreads/sysdeps/sparc/sparc32/tls.h.jj	2002-12-28 09:48:26.000000000 +0100
+++ libc/linuxthreads/sysdeps/sparc/sparc32/tls.h	2002-12-28 16:13:54.000000000 +0100
@@ -1,61 +0,0 @@
-/* Definitions for thread-local data handling.  linuxthreads/sparc32 version.
-   Copyright (C) 2002 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#ifndef _TLS_H
-#define _TLS_H
-
-#ifndef __ASSEMBLER__
-
-# include <pt-machine.h>
-# include <stddef.h>
-
-/* Type for the dtv.  */
-typedef union dtv
-{
-  size_t counter;
-  void *pointer;
-} dtv_t;
-
-typedef struct
-{
-  void *tcb;		/* Pointer to the TCB.  Not necessary the
-			   thread descriptor used by libpthread.  */
-  dtv_t *dtv;
-  void *self;		/* Pointer to the thread descriptor.  */
-  int multiple_threads;
-} tcbhead_t;
-
-#endif /* __ASSEMBLER__ */
-
-#undef USE_TLS
-
-#if USE_TLS
-
-#else
-
-#define NONTLS_INIT_TP \
-  do { 								\
-    static const tcbhead_t nontls_init_tp			\
-      = { .multiple_threads = 0 };				\
-    __thread_self = (__typeof (__thread_self)) &nontls_init_tp;	\
-  } while (0)
-
-#endif /* USE_TLS */
-
-#endif	/* tls.h */
--- libc/linuxthreads/sysdeps/sparc/sparc64/tls.h.jj	2002-12-28 09:48:49.000000000 +0100
+++ libc/linuxthreads/sysdeps/sparc/sparc64/tls.h	2002-12-28 16:13:54.000000000 +0100
@@ -1,61 +0,0 @@
-/* Definitions for thread-local data handling.  linuxthreads/sparc64 version.
-   Copyright (C) 2002 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#ifndef _TLS_H
-#define _TLS_H
-
-#ifndef __ASSEMBLER__
-
-# include <pt-machine.h>
-# include <stddef.h>
-
-/* Type for the dtv.  */
-typedef union dtv
-{
-  size_t counter;
-  void *pointer;
-} dtv_t;
-
-typedef struct
-{
-  void *tcb;		/* Pointer to the TCB.  Not necessary the
-			   thread descriptor used by libpthread.  */
-  dtv_t *dtv;
-  void *self;		/* Pointer to the thread descriptor.  */
-  int multiple_threads;
-} tcbhead_t;
-
-#endif /* __ASSEMBLER__ */
-
-#undef USE_TLS
-
-#if USE_TLS
-
-#else
-
-#define NONTLS_INIT_TP \
-  do { 								\
-    static const tcbhead_t nontls_init_tp			\
-      = { .multiple_threads = 0 };				\
-    __thread_self = (__typeof (__thread_self)) &nontls_init_tp;	\
-  } while (0)
-
-#endif /* USE_TLS */
-
-#endif	/* tls.h */
--- libc/linuxthreads/sysdeps/sparc/tls.h.jj	2002-12-28 16:13:54.000000000 +0100
+++ libc/linuxthreads/sysdeps/sparc/tls.h	2002-12-28 16:13:54.000000000 +0100
@@ -0,0 +1,63 @@
+/* Definitions for thread-local data handling.  linuxthreads/sparc version.
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef _TLS_H
+#define _TLS_H
+
+#ifndef __ASSEMBLER__
+
+# include <pt-machine.h>
+# include <stddef.h>
+
+/* Type for the dtv.  */
+typedef union dtv
+{
+  size_t counter;
+  void *pointer;
+} dtv_t;
+
+typedef struct
+{
+  void *tcb;		/* Pointer to the TCB.  Not necessary the
+			   thread descriptor used by libpthread.  */
+  dtv_t *dtv;
+  void *self;		/* Pointer to the thread descriptor.  */
+  int multiple_threads;
+} tcbhead_t;
+
+#else /* __ASSEMBLER__ */
+# include <tcb-offsets.h>
+#endif /* __ASSEMBLER__ */
+
+#undef USE_TLS
+
+#if USE_TLS
+
+#else
+
+#define NONTLS_INIT_TP \
+  do { 								\
+    static const tcbhead_t nontls_init_tp			\
+      = { .multiple_threads = 0 };				\
+    __thread_self = (__typeof (__thread_self)) &nontls_init_tp;	\
+  } while (0)
+
+#endif /* USE_TLS */
+
+#endif	/* tls.h */
--- libc/linuxthreads/sysdeps/sparc/Makefile.jj	2002-12-28 16:13:54.000000000 +0100
+++ libc/linuxthreads/sysdeps/sparc/Makefile	2002-12-28 16:13:54.000000000 +0100
@@ -0,0 +1,3 @@
+ifeq ($(subdir),csu)
+gen-as-const-headers += tcb-offsets.sym
+endif
--- libc/linuxthreads/sysdeps/sparc/tcb-offsets.sym.jj	2002-12-28 16:13:54.000000000 +0100
+++ libc/linuxthreads/sysdeps/sparc/tcb-offsets.sym	2002-12-28 16:13:54.000000000 +0100
@@ -0,0 +1,4 @@
+#include <sysdep.h>
+#include <tls.h>
+
+MULTIPLE_THREADS_OFFSET		offsetof (tcbhead_t, multiple_threads)
--- libc/linuxthreads/sysdeps/ia64/tls.h.jj	2002-12-28 09:47:27.000000000 +0100
+++ libc/linuxthreads/sysdeps/ia64/tls.h	2002-12-28 16:13:54.000000000 +0100
@@ -44,6 +44,9 @@ typedef struct
   void *self;		/* Pointer to the thread descriptor.  */
   int multiple_threads;
 } tcbhead_t;
+
+#else /* __ASSEMBLER__ */
+# include <tcb-offsets.h>
 #endif /* __ASSEMBLER__ */
 
 #undef USE_TLS
--- libc/linuxthreads/sysdeps/ia64/tcb-offsets.sym.jj	2002-12-28 16:13:54.000000000 +0100
+++ libc/linuxthreads/sysdeps/ia64/tcb-offsets.sym	2002-12-28 16:13:54.000000000 +0100
@@ -0,0 +1,4 @@
+#include <sysdep.h>
+#include <tls.h>
+
+MULTIPLE_THREADS_OFFSET		offsetof (tcbhead_t, multiple_threads)
--- libc/linuxthreads/sysdeps/ia64/Makefile.jj	2002-12-28 16:13:54.000000000 +0100
+++ libc/linuxthreads/sysdeps/ia64/Makefile	2002-12-28 16:13:54.000000000 +0100
@@ -0,0 +1,3 @@
+ifeq ($(subdir),csu)
+gen-as-const-headers += tcb-offsets.sym
+endif
--- libc/linuxthreads/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h.jj	2002-12-28 12:29:34.000000000 +0100
+++ libc/linuxthreads/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h	2002-12-28 16:13:54.000000000 +0100
@@ -24,10 +24,6 @@
 # include <linuxthreads/internals.h>
 #endif
 
-#if defined FLOATING_STACKS && USE___THREAD
-# define MULTIPLE_THREADS_OFFSET	20
-#endif
-
 #if !defined NOT_IN_libc || defined IS_IN_libpthread
 
 # undef PSEUDO
@@ -88,7 +84,7 @@
 #endif
 
 # ifndef ASSEMBLER
-#  if defined MULTIPLE_THREADS_OFFSET && defined PIC
+#  if defined FLOATING_STACKS && USE___THREAD && defined PIC
 #   define SINGLE_THREAD_P \
   __builtin_expect (THREAD_GETMEM (THREAD_SELF,				      \
 				   p_header.data.multiple_threads) == 0, 1)
@@ -99,7 +95,7 @@ extern int __local_multiple_threads attr
 # else
 #  if !defined PIC
 #   define SINGLE_THREAD_P cmpl $0, __local_multiple_threads
-#  elif defined MULTIPLE_THREADS_OFFSET
+#  elif defined FLOATING_STACKS && USE___THREAD
 #   define SINGLE_THREAD_P cmpl $0, %gs:MULTIPLE_THREADS_OFFSET
 #  else
 #   if !defined HAVE_HIDDEN || !USE___THREAD
--- libc/linuxthreads/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h.jj	2002-12-28 10:00:53.000000000 +0100
+++ libc/linuxthreads/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h	2002-12-28 16:13:54.000000000 +0100
@@ -23,8 +23,6 @@
 # include <linuxthreads/internals.h>
 #endif
 
-#define MULTIPLE_THREADS_OFFSET	40
-
 #if !defined NOT_IN_libc || defined IS_IN_libpthread
 
 # undef PSEUDO
--- libc/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h.jj	2002-12-28 10:10:50.000000000 +0100
+++ libc/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h	2002-12-28 16:13:54.000000000 +0100
@@ -23,8 +23,6 @@
 # include <linuxthreads/internals.h>
 #endif
 
-#define MULTIPLE_THREADS_OFFSET	20
-
 #if !defined NOT_IN_libc || defined IS_IN_libpthread
 
 # undef PSEUDO
--- libc/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h.jj	2002-12-28 10:08:46.000000000 +0100
+++ libc/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h	2002-12-28 16:13:54.000000000 +0100
@@ -23,8 +23,6 @@
 # include <linuxthreads/internals.h>
 #endif
 
-#define MULTIPLE_THREADS_OFFSET	40
-
 #if !defined NOT_IN_libc || defined IS_IN_libpthread
 
 # undef PSEUDO
--- libc/linuxthreads/pthread.c.jj	2002-12-28 13:00:45.000000000 +0100
+++ libc/linuxthreads/pthread.c	2002-12-28 16:13:54.000000000 +0100
@@ -558,11 +558,6 @@ int __pthread_initialize_manager(void)
   __pthread_multiple_threads = 1;
   __pthread_main_thread->p_header.data.multiple_threads = 1;
   * __libc_multiple_threads_ptr = 1;
-#ifdef MULTIPLE_THREADS_OFFSET
-  if (offsetof(struct _pthread_descr_struct, p_header.data.multiple_threads)
-      != MULTIPLE_THREADS_OFFSET)
-    abort ();
-#endif
 
 #ifndef HAVE_Z_NODELETE
   if (__builtin_expect (&__dso_handle != NULL, 1))
--- libc/linuxthreads/tst-cancel-wrappers.sh.jj	2002-12-28 13:00:45.000000000 +0100
+++ libc/linuxthreads/tst-cancel-wrappers.sh	2002-12-28 16:30:31.000000000 +0100
@@ -70,8 +70,8 @@ C["__xpg_sigpause"]=1
       # signals.c in linuxthreads does the cancellation checks not using
       # *_{enable,disable}_asynccancel.
       # Similarly pt-system.o* is allowed to call __libc_system directly.
-      if ((!seen_enable || !seen_disable)
-	  && !(object ~ /^signals.o/)
+      if ((!seen_enable || !seen_disable) \
+	  && !(object ~ /^signals.o/) \
 	  && !(object ~ /^pt-system.o/))
 	{
 	  printf "in '$1'(%s) %s'\''s cancellation missing\n", object, seen
--- libc/nptl/sysdeps/i386/tls.h.jj	2002-12-28 11:00:45.000000000 +0100
+++ libc/nptl/sysdeps/i386/tls.h	2002-12-28 16:15:50.000000000 +0100
@@ -46,6 +46,9 @@ typedef struct
   uintptr_t sysinfo;
   list_t list;
 } tcbhead_t;
+
+#else /* __ASSEMBLER__ */
+# include <tcb-offsets.h>
 #endif
 
 
@@ -61,15 +64,6 @@ typedef struct
    the SSE memory functions.  */
 #define STACK_ALIGN	16
 
-/* Offset of the MULTIPLE_THREADS element in tcbhead_t.  */
-#define MULTIPLE_THREADS_OFFSET 12
-
-#ifdef NEED_DL_SYSINFO
-/* Offset of the SYSINFO element in tcbhead_t.  */
-# define SYSINFO_OFFSET 16
-#endif
-
-
 #ifndef __ASSEMBLER__
 /* Get system call information.  */
 # include <sysdep.h>
--- libc/nptl/sysdeps/i386/Makefile.jj	2002-12-28 16:13:54.000000000 +0100
+++ libc/nptl/sysdeps/i386/Makefile	2002-12-28 16:13:54.000000000 +0100
@@ -0,0 +1,3 @@
+ifeq ($(subdir),csu)
+gen-as-const-headers += tcb-offsets.sym
+endif
--- libc/nptl/sysdeps/i386/tcb-offsets.sym.jj	2002-12-28 16:13:54.000000000 +0100
+++ libc/nptl/sysdeps/i386/tcb-offsets.sym	2002-12-28 16:13:54.000000000 +0100
@@ -0,0 +1,5 @@
+#include <sysdep.h>
+#include <tls.h>
+
+MULTIPLE_THREADS_OFFSET		offsetof (tcbhead_t, multiple_threads)
+SYSINFO_OFFSET			offsetof (tcbhead_t, sysinfo)
--- libc/nptl/sysdeps/pthread/tcb-offsets.h.jj	2002-12-28 16:49:14.000000000 +0100
+++ libc/nptl/sysdeps/pthread/tcb-offsets.h	2002-12-28 16:49:05.000000000 +0100
@@ -0,0 +1 @@
+/* This is overridden by generated tcb-offsets.h on arches which need it.  */
--- libc/nptl/sysdeps/unix/sysv/linux/libc_pthread_init.c.jj	2002-12-20 12:17:13.000000000 +0100
+++ libc/nptl/sysdeps/unix/sysv/linux/libc_pthread_init.c	2002-12-28 16:13:54.000000000 +0100
@@ -52,23 +52,4 @@ __libc_pthread_init (ptr, reclaim, funct
   memcpy (&__libc_pthread_functions, functions,
 	  sizeof (__libc_pthread_functions));
 #endif
-
-  /* We have a macro which is used in asm code describing data layout.
-     Make sure it does not get out of date.  */
-  if (offsetof (struct pthread, header.data.multiple_threads)
-      != MULTIPLE_THREADS_OFFSET)
-    {
-#define str_n_len(str) str, sizeof (str) - 1
-      __libc_write (STDERR_FILENO,
-		    str_n_len ("*** MULTIPLE_THREADS_OFFSET out of date\n"));
-      _exit (1);
-    }
-#ifdef SYSINFO_OFFSET
-  if (offsetof (struct pthread, header.data.sysinfo) != SYSINFO_OFFSET)
-    {
-      __libc_write (STDERR_FILENO,
-		    str_n_len ("*** SYSINFO_OFFSET out of date\n"));
-      _exit (1);
-    }
-#endif
 }
--- libc/nptl/sysdeps/unix/sysv/linux/Versions.jj	2002-12-12 12:40:49.000000000 +0100
+++ libc/nptl/sysdeps/unix/sysv/linux/Versions	2002-12-28 16:32:03.000000000 +0100
@@ -1,6 +1,9 @@
 libc {
+  GLIBC_2.3.2 {
+    __register_atfork;
+  }
   GLIBC_PRIVATE {
-    __register_atfork; __libc_pthread_init;
+    __libc_pthread_init;
     __libc_current_sigrtmin_private; __libc_current_sigrtmax_private;
     __libc_allocate_rtsig_private;
   }

	Jakub


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