automake-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FYI] {micro} tests: sanitize 'unset' usages


From: Stefano Lattarini
Subject: [FYI] {micro} tests: sanitize 'unset' usages
Date: Sat, 18 May 2013 15:20:26 +0200

In some shells (e.g., Solaris 10 /bin/ksh, or NetBSD 5.1 /bin/sh),
"unset VAR" returns a non-zero exit status in case the VAR variable
is already unset.  This doesn't interact well with our usage of
"set -e" in the testsuite.  So far, we've avoided spurious failures
by either explicitly ignoring the exit status from unset:

    unset VAR || :

or explicitly ensuring that a variable is set, before trying to
unset it:

    VAR=; unset VAR

But we can do better, by aliasing the 'unset' command to a custom
function that will take care of these details for us.  This will
avoid us annoying spurious failures in the future, failures that
have already bitten us too much times.  For an example, refer to
commit 'v1.12.2-88-g5b1dae5' of 2012-08-05 (tests: avoid tons of
spurious failures on NetBSD).

* t/ax/test-lib.sh (_am_unset): New function.
(unset): New alias to it.
(_am_exit): Adjust comments.
* t/ax/am-test-lib.sh: No need to temporary disable the 'errexit'
shell flag when unsetting variables that are potentially already
unset.
(am_process_requirements): Adjust to remove a now-useless
workaround related to unset.
* t/aclocal-macrodir.tap: Likewise.
* t/aclocal-macrodirs.tap: Likewise.
* t/auxdir-autodetect.sh: Likewise.
* t/ax/am-test-lib.sh: Likewise.
* t/ax/test-lib.sh: Likewise.
* t/check-tests-in-builddir.sh: Likewise.
* t/dist-formats.tap: Likewise.
* t/distcheck-configure-flags-am.sh: Likewise.
* t/distcheck-configure-flags.sh: Likewise.
* t/java-empty-classpath.sh: Likewise.
* t/javaflags.sh: Likewise.
* t/lflags.sh: Likewise.
* t/lflags2.sh: Likewise.
* t/lisp-flags.sh: Likewise.
* t/lisp6.sh: Likewise.
* t/missing-auxfile-stops-makefiles-creation.sh: Likewise.
* t/parallel-am.sh: Likewise.
* t/parallel-am2.sh: Likewise.
* t/parallel-am3.sh: Likewise.
* t/parallel-tests-log-override-recheck.sh: Likewise.
* t/pkg-config-macros.sh: Likewise.
* t/python-missing.sh: Likewise.
* t/python-too-old.sh: Likewise.
* t/python11.sh: Likewise.
* t/self-check-dir.tap: Likewise.
* t/self-check-report.sh: Likewise.
* t/self-check-seq.tap: Likewise.
* t/silent-configsite.sh: Likewise.
* t/suffix6c.sh: Likewise.
* t/tar-override.sh: Likewise.
* t/tests-environment-and-log-compiler.sh: Likewise.
* t/vala-configure.sh: Likewise.
* t/werror3.sh: Likewise.
* t/yflags-cmdline-override.sh: Likewise.
* t/yflags.sh: Likewise.
* t/yflags2.sh: Likewise.

Signed-off-by: Stefano Lattarini <address@hidden>
---
 t/aclocal-macrodir.tap                        |  2 +-
 t/aclocal-macrodirs.tap                       |  2 +-
 t/auxdir-autodetect.sh                        |  2 +-
 t/ax/am-test-lib.sh                           | 10 +---------
 t/ax/test-lib.sh                              | 19 ++++++++++++++++++-
 t/check-tests-in-builddir.sh                  |  2 +-
 t/dist-formats.tap                            |  2 +-
 t/distcheck-configure-flags-am.sh             |  2 +-
 t/distcheck-configure-flags.sh                |  2 +-
 t/java-empty-classpath.sh                     |  4 ++--
 t/javaflags.sh                                |  2 +-
 t/lflags.sh                                   |  2 +-
 t/lflags2.sh                                  |  2 +-
 t/lisp-flags.sh                               |  2 +-
 t/lisp6.sh                                    |  2 +-
 t/missing-auxfile-stops-makefiles-creation.sh |  2 +-
 t/parallel-am.sh                              |  2 +-
 t/parallel-am2.sh                             |  2 +-
 t/parallel-am3.sh                             |  2 +-
 t/parallel-tests-log-override-recheck.sh      |  2 +-
 t/pkg-config-macros.sh                        |  2 +-
 t/python-missing.sh                           |  2 +-
 t/python-too-old.sh                           |  2 +-
 t/python11.sh                                 |  2 +-
 t/self-check-dir.tap                          |  2 +-
 t/self-check-report.sh                        |  2 +-
 t/self-check-seq.tap                          |  2 +-
 t/silent-configsite.sh                        |  2 +-
 t/suffix6c.sh                                 |  2 +-
 t/tar-override.sh                             |  2 +-
 t/tests-environment-and-log-compiler.sh       |  2 +-
 t/vala-configure.sh                           |  2 +-
 t/werror3.sh                                  |  2 +-
 t/yflags-cmdline-override.sh                  |  2 +-
 t/yflags.sh                                   |  2 +-
 t/yflags2.sh                                  |  2 +-
 36 files changed, 54 insertions(+), 45 deletions(-)

diff --git a/t/aclocal-macrodir.tap b/t/aclocal-macrodir.tap
index fb80609..4d11917 100644
--- a/t/aclocal-macrodir.tap
+++ b/t/aclocal-macrodir.tap
@@ -23,7 +23,7 @@ am_create_testdir=empty
 plan_ 7
 
 ocwd=$(pwd) || fatal_ "getting current working directory"
-ACLOCAL_PATH=; unset ACLOCAL_PATH
+unset ACLOCAL_PATH
 
 #
 # General utility functions and variables.
diff --git a/t/aclocal-macrodirs.tap b/t/aclocal-macrodirs.tap
index 0898c29..1cbf6d7 100644
--- a/t/aclocal-macrodirs.tap
+++ b/t/aclocal-macrodirs.tap
@@ -23,7 +23,7 @@ am_create_testdir=empty
 plan_ 15
 
 ocwd=$(pwd) || fatal_ "getting current working directory"
-ACLOCAL_PATH=; unset ACLOCAL_PATH
+unset ACLOCAL_PATH
 
 #
 # General utility functions and variables.
diff --git a/t/auxdir-autodetect.sh b/t/auxdir-autodetect.sh
index 17567c0..457e06a 100644
--- a/t/auxdir-autodetect.sh
+++ b/t/auxdir-autodetect.sh
@@ -21,7 +21,7 @@
 
 nil=__no_such_program
 
-unset NONESUCH || :
+unset NONESUCH
 
 cat >>configure.ac << END
 AM_MISSING_PROG([NONESUCH],[$nil])
diff --git a/t/ax/am-test-lib.sh b/t/ax/am-test-lib.sh
index e14f96f..5804372 100644
--- a/t/ax/am-test-lib.sh
+++ b/t/ax/am-test-lib.sh
@@ -34,11 +34,6 @@ distdir=$me-1.0
 ##  Environment cleanup.  ##
 ## ---------------------- ##
 
-# Temporarily disable this, since some shells (e.g., older version
-# of Bash) can return a non-zero exit status upon the when a non-set
-# variable is unset.
-set +e
-
 # Unset some make-related variables that may cause $MAKE to act like
 # a recursively invoked sub-make.  Any $MAKE invocation in a test is
 # conceptually an independent invocation, not part of the main
@@ -85,9 +80,6 @@ for pfx in TEST_ SH_ TAP_ ''; do
 done
 unset pfx
 
-# Re-enable, it had been temporarily disabled above.
-set -e
-
 # cross_compiling
 # ---------------
 # Tell whether we are cross-compiling.  This is especially useful to skip
@@ -805,7 +797,7 @@ process_requirements ()
       *" $am_tool"*) . ./t/$am_tool-macros.dir/get.sh;;
     esac
   done
-  am_tool=; unset am_tool
+  unset am_tool
 }
 
 ## ---------------------------------------------------------------- ##
diff --git a/t/ax/test-lib.sh b/t/ax/test-lib.sh
index 5be0cec..ee83dcf 100644
--- a/t/ax/test-lib.sh
+++ b/t/ax/test-lib.sh
@@ -92,7 +92,7 @@ _am_exit ()
   set +e
   # See comments in the exit trap for the reason we do this.
   test 77 = $1 && am__test_skipped=yes
-  # Spurious escaping to ensure we do not call our 'exit' alias.
+  # Extra escaping to ensure we do not call our 'exit' alias.
   (\exit $1); \exit $1
 }
 # Avoid interferences from the environment
@@ -101,6 +101,23 @@ am__test_skipped=no
 # just inside a function definition.  Weird, but real.
 alias exit=_am_exit
 
+# In some shells (e.g., Solaris 10 /bin/ksh, or NetBSD 5.1 /bin/sh),
+# "unset VAR" returns a non-zero exit status in case the VAR variable
+# is already unset.  This doesn't interact well with our usage of
+# "set -e" in the testsuite.  This function and the alias below help
+# to work around the issue.
+_am_unset ()
+{
+  for _am_v
+  do
+    # Extra escaping (here and below) to ensure we do not call our
+    # 'unset' alias.
+    eval ${_am_v}=dummy && \unset ${_am_v} || exit 1
+  done
+  \unset _am_v
+}
+alias unset=_am_unset
+
 ## ------------------------------------ ##
 ##  General testsuite shell functions.  ##
 ## ------------------------------------ ##
diff --git a/t/check-tests-in-builddir.sh b/t/check-tests-in-builddir.sh
index fad6527..1c41368 100644
--- a/t/check-tests-in-builddir.sh
+++ b/t/check-tests-in-builddir.sh
@@ -35,7 +35,7 @@ exit ${FOO_EXIT_STATUS-0}
 END
 chmod a+x foo.test
 
-unset FOO_EXIT_STATUS || :
+unset FOO_EXIT_STATUS
 
 $ACLOCAL
 $AUTOCONF
diff --git a/t/dist-formats.tap b/t/dist-formats.tap
index 730fa5d..7829512 100644
--- a/t/dist-formats.tap
+++ b/t/dist-formats.tap
@@ -28,7 +28,7 @@ plan_ 70
 
 ocwd=$(pwd) || fatal_ "getting current working directory"
 
-TAR='' && unset TAR
+unset TAR
 
 # Create common aclocal.m4 file, for later tests.
 mkdir setup \
diff --git a/t/distcheck-configure-flags-am.sh 
b/t/distcheck-configure-flags-am.sh
index f38b1dc..b1fd49b 100644
--- a/t/distcheck-configure-flags-am.sh
+++ b/t/distcheck-configure-flags-am.sh
@@ -27,7 +27,7 @@ AS_IF([test $success = yes && test "$sentence" = 'it works 
:-)'],
 AC_OUTPUT
 END
 
-unset sentence || :
+unset sentence
 
 cat > Makefile.am << 'END'
 AM_DISTCHECK_CONFIGURE_FLAGS = $(dc_flags1) $(dc_flags2)
diff --git a/t/distcheck-configure-flags.sh b/t/distcheck-configure-flags.sh
index b1725f2..3c23117 100644
--- a/t/distcheck-configure-flags.sh
+++ b/t/distcheck-configure-flags.sh
@@ -26,7 +26,7 @@ AS_IF([test $success = yes && test "$sentence" = 'it works 
:-)'],
 AC_OUTPUT
 END
 
-unset sentence || :
+unset sentence
 
 : > Makefile.am
 
diff --git a/t/java-empty-classpath.sh b/t/java-empty-classpath.sh
index 387c4c3..cc3dae3 100644
--- a/t/java-empty-classpath.sh
+++ b/t/java-empty-classpath.sh
@@ -74,7 +74,7 @@ $AUTOCONF
 $AUTOMAKE
 ./configure
 
-unset CLASSPATH || :
+unset CLASSPATH
 $MAKE
 $MAKE clean
 
@@ -82,7 +82,7 @@ CLASSPATH=''; export CLASSPATH
 $MAKE
 $MAKE clean
 
-unset CLASSPATH || :
+unset CLASSPATH
 $MAKE distcheck
 
 :
diff --git a/t/javaflags.sh b/t/javaflags.sh
index c1c2671..bb9ab26 100644
--- a/t/javaflags.sh
+++ b/t/javaflags.sh
@@ -26,7 +26,7 @@ chmod a+x fake-javac
 
 # Remove JAVAC from the environment, so that it won't interfere
 # with 'make -e' below.
-unset JAVAC || :
+unset JAVAC
 
 cat >> configure.ac <<'END'
 AC_PROG_CC
diff --git a/t/lflags.sh b/t/lflags.sh
index 3074bdf..18268b1 100644
--- a/t/lflags.sh
+++ b/t/lflags.sh
@@ -31,7 +31,7 @@ chmod a+x fake-lex
 
 # Remove Lex from the environment, so that it won't interfere
 # with 'make -e' below.
-unset LEX || :
+unset LEX
 
 cat >> configure.ac <<'END'
 AC_SUBST([CC], [false])
diff --git a/t/lflags2.sh b/t/lflags2.sh
index 2507778..a959aea 100644
--- a/t/lflags2.sh
+++ b/t/lflags2.sh
@@ -30,7 +30,7 @@ chmod a+x fake-lex
 
 # Remove Lex from the environment, so that it won't interfere
 # with 'make -e' below.
-unset LEX || :
+unset LEX
 
 cat >> configure.ac <<'END'
 AC_SUBST([CXX], [false])
diff --git a/t/lisp-flags.sh b/t/lisp-flags.sh
index 1ea5b8e..a31bcfd 100644
--- a/t/lisp-flags.sh
+++ b/t/lisp-flags.sh
@@ -20,7 +20,7 @@
 
 # Don't get fooled when running as an Emacs subprocess.  This is
 # for the benefit of the "make -e" invocation below.
-EMACS=; unset EMACS
+unset EMACS
 
 cat > Makefile.am << 'EOF'
 lisp_LISP = foo.el
diff --git a/t/lisp6.sh b/t/lisp6.sh
index 4b5f006..0dd4344 100644
--- a/t/lisp6.sh
+++ b/t/lisp6.sh
@@ -39,7 +39,7 @@ AC_OUTPUT
 EOF
 
 # Avoid possible spurious influences from the environment.
-want_two=; unset want_two
+unset want_two
 
 echo "(provide 'am-one)" > am-one.el
 echo "(require 'am-one)" > am-two.el
diff --git a/t/missing-auxfile-stops-makefiles-creation.sh 
b/t/missing-auxfile-stops-makefiles-creation.sh
index 50aa48a..754b316 100644
--- a/t/missing-auxfile-stops-makefiles-creation.sh
+++ b/t/missing-auxfile-stops-makefiles-creation.sh
@@ -36,7 +36,7 @@ done
 
 $ACLOCAL
 
-unset AUTOMAKE_JOBS || :
+unset AUTOMAKE_JOBS
 
 AUTOMAKE_fails
 ls -l Makefile.in */Makefile.in || : # For debugging.
diff --git a/t/parallel-am.sh b/t/parallel-am.sh
index 4be5eea..ea39518 100644
--- a/t/parallel-am.sh
+++ b/t/parallel-am.sh
@@ -80,7 +80,7 @@ $ACLOCAL
 # Further, automake output should be stable.
 
 # Generate expected output using the non-threaded code.
-unset AUTOMAKE_JOBS || :
+unset AUTOMAKE_JOBS
 AUTOMAKE_run --add-missing
 mv stderr expected
 Makefile_ins=$(find . -name Makefile.in)
diff --git a/t/parallel-am2.sh b/t/parallel-am2.sh
index 2f8627d..10fc51b 100644
--- a/t/parallel-am2.sh
+++ b/t/parallel-am2.sh
@@ -60,7 +60,7 @@ $ACLOCAL
 # Thus we install the auxiliary files in a prior step.
 
 # Generate expected output using non-threaded code.
-unset AUTOMAKE_JOBS || :
+unset AUTOMAKE_JOBS
 rm -f install-sh missing depcomp
 AUTOMAKE_fails --add-missing
 mv stderr expected
diff --git a/t/parallel-am3.sh b/t/parallel-am3.sh
index 1c87e63..146e59f 100644
--- a/t/parallel-am3.sh
+++ b/t/parallel-am3.sh
@@ -56,7 +56,7 @@ mkdir build-aux
 $ACLOCAL
 
 # Generate expected output using the non-threaded code.
-unset AUTOMAKE_JOBS || :
+unset AUTOMAKE_JOBS
 AUTOMAKE_run --add-missing
 mv stderr expected
 mv Makefile.in Makefile.in.exp
diff --git a/t/parallel-tests-log-override-recheck.sh 
b/t/parallel-tests-log-override-recheck.sh
index c2ea05d..d1fec7f 100644
--- a/t/parallel-tests-log-override-recheck.sh
+++ b/t/parallel-tests-log-override-recheck.sh
@@ -47,7 +47,7 @@ END
 
 chmod a+x *.test
 
-unset BAZ_EXIT_STATUS || :
+unset BAZ_EXIT_STATUS
 
 $ACLOCAL
 $AUTOCONF
diff --git a/t/pkg-config-macros.sh b/t/pkg-config-macros.sh
index 5069c08..cfa49cf 100644
--- a/t/pkg-config-macros.sh
+++ b/t/pkg-config-macros.sh
@@ -78,7 +78,7 @@ else
    echo "skip_all_ \"pkg-config m4 macros not found\"" >> get.sh
 fi
 
-ACLOCAL_PATH=; unset ACLOCAL_PATH
+unset ACLOCAL_PATH
 . ./get.sh
 
 $ACLOCAL --force -I m4 || cat >> get.sh <<'END'
diff --git a/t/python-missing.sh b/t/python-missing.sh
index 0a9a073..66eca9e 100644
--- a/t/python-missing.sh
+++ b/t/python-missing.sh
@@ -22,7 +22,7 @@ am_create_testdir=empty
 # An actual python is *not* required in this test.
 . test-init.sh
 
-PYTHON=; unset PYTHON
+unset PYTHON
 
 cat > configure.ac <<END
 AC_INIT([$me], [1.0])
diff --git a/t/python-too-old.sh b/t/python-too-old.sh
index 6a81215..0042799 100644
--- a/t/python-too-old.sh
+++ b/t/python-too-old.sh
@@ -35,7 +35,7 @@ py_too_old ()
 }
 
 saved_PYTHON=$PYTHON; export saved_PYTHON
-PYTHON=; unset PYTHON
+unset PYTHON
 
 cat > configure.ac <<END
 AC_INIT([$me], [1.0])
diff --git a/t/python11.sh b/t/python11.sh
index c5fedf7..faf09d8 100644
--- a/t/python11.sh
+++ b/t/python11.sh
@@ -20,7 +20,7 @@
 . test-init.sh
 
 # We don't want to allow user overrides in this test.
-PYTHON=; unset PYTHON
+unset PYTHON
 
 cat >>configure.ac <<'EOF'
 m4_define([_AM_PYTHON_INTERPRETER_LIST], [IShouldNotExist1 IShouldNotExist2])
diff --git a/t/self-check-dir.tap b/t/self-check-dir.tap
index b871b66..68e9edf 100644
--- a/t/self-check-dir.tap
+++ b/t/self-check-dir.tap
@@ -24,7 +24,7 @@ am_create_testdir=no
 
 plan_ 5
 
-keep_testdirs=; unset keep_testdirs
+unset keep_testdirs
 
 # This needs to be consistent with what $AM_TEST_RUNNER_SHELL
 # deems to be the current working directory.
diff --git a/t/self-check-report.sh b/t/self-check-report.sh
index c52c567..99b9838 100644
--- a/t/self-check-report.sh
+++ b/t/self-check-report.sh
@@ -18,7 +18,7 @@
 # Test subroutines to report warnings, and to signal failures, skips
 # and hard errors.
 
-unset stderr_fileno_ || :
+unset stderr_fileno_
 
 am_create_testdir=empty
 . test-init.sh
diff --git a/t/self-check-seq.tap b/t/self-check-seq.tap
index 3c5e2dc..4e9d58f 100644
--- a/t/self-check-seq.tap
+++ b/t/self-check-seq.tap
@@ -21,7 +21,7 @@
 
 plan_ 14
 
-unset stderr_fileno_ || :
+unset stderr_fileno_
 
 check_work ()
 {
diff --git a/t/silent-configsite.sh b/t/silent-configsite.sh
index 1df7673..6146533 100644
--- a/t/silent-configsite.sh
+++ b/t/silent-configsite.sh
@@ -33,7 +33,7 @@ test-nosilent:
        test x'$(AM_DEFAULT_VERBOSITY)' = x'1'
 EOF
 
-unset enable_silent_rules || :
+unset enable_silent_rules
 
 : 'No explicit default in configure.ac, enable by default in config.site'
 
diff --git a/t/suffix6c.sh b/t/suffix6c.sh
index 353585d..00c6da3 100644
--- a/t/suffix6c.sh
+++ b/t/suffix6c.sh
@@ -31,7 +31,7 @@ AC_SUBST([OBJEXT])
 AC_OUTPUT
 END
 
-unset OBJEXT || :
+unset OBJEXT
 
 cat > Makefile.am << 'END'
 SUFFIXES = .zoo .o .obj address@hidden@
diff --git a/t/tar-override.sh b/t/tar-override.sh
index bbf3fbb..d5bbd56 100644
--- a/t/tar-override.sh
+++ b/t/tar-override.sh
@@ -59,7 +59,7 @@ test "$(cat am--tar-has-run)" = foo
 
 clean_temp
 
-TAR=; unset TAR
+unset TAR
 # Creative use of eval to pacify maintainer checks.
 eval \$'MAKE dist "TAR=./am--tar mu"'
 test -f $distdir.tar.gz
diff --git a/t/tests-environment-and-log-compiler.sh 
b/t/tests-environment-and-log-compiler.sh
index 283e7d3..5f0e2f5 100644
--- a/t/tests-environment-and-log-compiler.sh
+++ b/t/tests-environment-and-log-compiler.sh
@@ -24,7 +24,7 @@ cat >> configure.ac << 'END'
 AC_OUTPUT
 END
 
-unset v0 v1 v2 v3 v4 || :
+unset v0 v1 v2 v3 v4
 
 cat > Makefile.am << 'END'
 TESTS_ENVIRONMENT = am__f3 () { echo 3; }; v0='$(srcdir)' v1=1; :;
diff --git a/t/vala-configure.sh b/t/vala-configure.sh
index cbba4bd..4f59d07 100644
--- a/t/vala-configure.sh
+++ b/t/vala-configure.sh
@@ -53,7 +53,7 @@ chmod +x bin/valac.old
 PATH=$(pwd)/bin$PATH_SEPARATOR$PATH; export PATH
 
 # Avoid interferences from the environment.
-VALAC= vala_version=; unset VALAC vala_version
+unset VALAC vala_version
 
 $ACLOCAL
 $AUTOMAKE -a
diff --git a/t/werror3.sh b/t/werror3.sh
index c6007c8..c1ec28a 100644
--- a/t/werror3.sh
+++ b/t/werror3.sh
@@ -36,7 +36,7 @@ END
 $ACLOCAL
 
 # The issue would not manifest with threaded execution.
-unset AUTOMAKE_JOBS || :
+unset AUTOMAKE_JOBS
 AUTOMAKE_run -Wno-error
 grep 'VAR multiply defined' stderr
 
diff --git a/t/yflags-cmdline-override.sh b/t/yflags-cmdline-override.sh
index 613c35c..3eea823 100644
--- a/t/yflags-cmdline-override.sh
+++ b/t/yflags-cmdline-override.sh
@@ -20,7 +20,7 @@
 required='cc yacc'
 . test-init.sh
 
-unset YFLAGS || :
+unset YFLAGS
 
 cat >> configure.ac <<'END'
 AC_PROG_CC
diff --git a/t/yflags.sh b/t/yflags.sh
index 8d17dc8..f8fe7a4 100644
--- a/t/yflags.sh
+++ b/t/yflags.sh
@@ -30,7 +30,7 @@ chmod a+x fake-yacc
 
 # Remove Yacc from the environment, so that it won't interfere
 # with 'make -e' below.
-unset YACC || :
+unset YACC
 
 cat >> configure.ac <<'END'
 AC_SUBST([CC], [false])
diff --git a/t/yflags2.sh b/t/yflags2.sh
index 37dce3f..12eb5d7 100644
--- a/t/yflags2.sh
+++ b/t/yflags2.sh
@@ -30,7 +30,7 @@ chmod a+x fake-yacc
 
 # Remove Yacc from the environment, so that it won't interfere
 # with 'make -e' below.
-unset YACC || :
+unset YACC
 
 cat >> configure.ac <<'END'
 AC_SUBST([CXX], [false])
-- 
1.8.3.rc2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]