a useful decorator for cleaning up threads
diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py
index b736755..e77b246 100644
--- a/Lib/test/test_hashlib.py
+++ b/Lib/test/test_hashlib.py
@@ -254,14 +254,9 @@
 
         self.assertEqual(expected_hash, hasher.hexdigest())
 
-
+@test_support.reap_threads
 def test_main():
-    key = test_support.threading_setup()
-    try:
-        test_support.run_unittest(HashLibTestCase)
-    finally:
-        test_support.threading_cleanup(*key)
-
+    test_support.run_unittest(HashLibTestCase)
 
 if __name__ == "__main__":
     test_main()
diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py
index 7d0ec8d..52dd16e 100644
--- a/Lib/test/test_support.py
+++ b/Lib/test/test_support.py
@@ -5,6 +5,7 @@
 
 import contextlib
 import errno
+import functools
 import socket
 import sys
 import os
@@ -934,6 +935,16 @@
         count += 1
         time.sleep(0.1)
 
+def reap_threads(func):
+    @functools.wraps(func)
+    def decorator(*args):
+        key = threading_setup()
+        try:
+            return func(*args)
+        finally:
+            threading_cleanup(*key)
+    return decorator
+
 def reap_children():
     """Use this function at the end of test_main() whenever sub-processes
     are started.  This will help ensure that no extra children (zombies)