Index: kernel/Makefile
===================================================================
--- kernel/Makefile	(revision 5b6c03370fd0afc552e341134e2e6161f611a180)
+++ kernel/Makefile	(revision 9f8745c5331a919e144b6084cb90d7f5b2eaccba)
@@ -305,8 +305,7 @@
 		test/synch/semaphore1.c \
 		test/synch/semaphore2.c \
-		test/synch/rcu1.c \
-		test/synch/workqueue1.c \
 		test/synch/workqueue2.c \
 		test/synch/workqueue3.c \
+		test/synch/rcu1.c \
 		test/print/print1.c \
 		test/print/print2.c \
Index: kernel/generic/include/synch/workqueue.h
===================================================================
--- kernel/generic/include/synch/workqueue.h	(revision 5b6c03370fd0afc552e341134e2e6161f611a180)
+++ kernel/generic/include/synch/workqueue.h	(revision 9f8745c5331a919e144b6084cb90d7f5b2eaccba)
@@ -1,2 +1,35 @@
+/*
+ * Copyright (c) 2012 Adam Hraska
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup generic
+ * @{
+ */
+/** @file
+ */
 
 #ifndef KERN_WORKQUEUE_H_
@@ -46,2 +79,5 @@
 
 #endif /* KERN_WORKQUEUE_H_ */
+
+/** @}
+ */
Index: kernel/generic/src/synch/workqueue.c
===================================================================
--- kernel/generic/src/synch/workqueue.c	(revision 5b6c03370fd0afc552e341134e2e6161f611a180)
+++ kernel/generic/src/synch/workqueue.c	(revision 9f8745c5331a919e144b6084cb90d7f5b2eaccba)
@@ -1,2 +1,40 @@
+/*
+ * Copyright (c) 2012 Adam Hraska
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup generic
+ * @{
+ */
+
+/**
+ * @file
+ * @brief Work queue/thread pool that automatically adjusts its size
+ *        depending on the current load. Queued work functions may sleep..
+ */
+
 #include <synch/workqueue.h>
 #include <synch/spinlock.h>
@@ -934,2 +972,5 @@
 #endif
 }
+
+/** @}
+ */
Index: kernel/test/synch/workq-test-core.h
===================================================================
--- kernel/test/synch/workq-test-core.h	(revision 5b6c03370fd0afc552e341134e2e6161f611a180)
+++ kernel/test/synch/workq-test-core.h	(revision 9f8745c5331a919e144b6084cb90d7f5b2eaccba)
@@ -203,5 +203,5 @@
 		return NULL;
 	else {
-		return "Failed to invoke the expected number of calls.";
-	}
-}
+		return "Failed to invoke the expected number of calls.\n";
+	}
+}
Index: rnel/test/synch/workqueue1.c
===================================================================
--- kernel/test/synch/workqueue1.c	(revision 5b6c03370fd0afc552e341134e2e6161f611a180)
+++ 	(revision )
@@ -1,61 +1,0 @@
-/*
- * Copyright (c) 2012 Adam Hraska
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * - The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <test.h>
-#include <arch.h>
-#include <atomic.h>
-#include <print.h>
-#include <proc/thread.h>
-
-#include <synch/workqueue.h>
-
-
-static work_t work;
-static int done = 0;
-
-static void func(work_t *work_item)
-{
-	done = 1;
-	printf("func()");
-}
-
-
-const char *test_workqueue1(void)
-{
-	done = 0;
-	workq_global_enqueue(&work, func);
-	
-	while (!done) {
-		printf(".");
-		thread_sleep(1);
-	}
-
-	printf("\ndone\n");
-
-	return NULL;
-}
Index: rnel/test/synch/workqueue1.def
===================================================================
--- kernel/test/synch/workqueue1.def	(revision 5b6c03370fd0afc552e341134e2e6161f611a180)
+++ 	(revision )
@@ -1,6 +1,0 @@
-{
-	"workqueue1",
-	"Basic work queue test",
-	&test_workqueue1,
-	true
-},
Index: kernel/test/synch/workqueue2.c
===================================================================
--- kernel/test/synch/workqueue2.c	(revision 5b6c03370fd0afc552e341134e2e6161f611a180)
+++ kernel/test/synch/workqueue2.c	(revision 9f8745c5331a919e144b6084cb90d7f5b2eaccba)
@@ -47,4 +47,33 @@
 
 
+/*-------------------------------------------------------------------*/
+
+static work_t basic_work;
+static int basic_done = 0;
+
+static void basic_test_work(work_t *work_item)
+{
+	basic_done = 1;
+	TPRINTF("basic_test_work()");
+}
+
+
+static void basic_test(void)
+{
+	TPRINTF("Issue a single work item.\n");
+	basic_done = 0;
+	workq_global_enqueue(&basic_work, basic_test_work);
+	
+	while (!basic_done) {
+		TPRINTF(".");
+		thread_sleep(1);
+	}
+
+	TPRINTF("\nBasic test done\n");
+}
+
+/*-------------------------------------------------------------------*/
+
+
 struct work_queue *workq = NULL;
 
@@ -53,16 +82,16 @@
 	return workq_enqueue(workq, work_item, func);
 }
+/*-------------------------------------------------------------------*/
 
 
-
-const char *test_workqueue2(void)
+static const char *test_custom_workq_impl(bool stop, const char *qname)
 {
-	workq = workq_create("test-workq");
+	workq = workq_create(qname);
 	
 	if (!workq) {
-		return "Failed to create a work queue.";
+		return "Failed to create a work queue.\n";
 	}
 	
-	const char *ret = run_workq_core(false);
+	const char *ret = run_workq_core(stop);
 	
 	TPRINTF("Stopping work queue...\n");
@@ -71,26 +100,49 @@
 	TPRINTF("Destroying work queue...\n");
 	workq_destroy(workq);
-
 	return ret;
 }
 
+static const char *test_custom_workq(void)
+{
+	TPRINTF("Stress testing a custom queue.\n");
+	return test_custom_workq_impl(false, "test-workq");
+}
 
-const char *test_workqueue2stop(void)
+
+static const char *test_custom_workq_stop(void)
 {
-	workq = workq_create("test-workq");
+	TPRINTF("Stress testing a custom queue. Stops prematurely. "
+		"Errors are expected.\n");
+	test_custom_workq_impl(true, "test-workq-stop");
+	/* Errors are expected. */
+	return 0;
+}
+
+
+const char *test_workqueue_all(void)
+{
+	const char *err = 0;
+	const char *res;
 	
-	if (!workq) {
-		return "Failed to create a work queue.";
+	basic_test();
+	
+	res = test_custom_workq();
+	if (res) {
+		TPRINTF(res);
+		err = res;
 	}
 	
-	const char *ret = run_workq_core(true);
+	res = test_custom_workq_stop();
+	if (res) {
+		TPRINTF(res);
+		err = res;
+	}
 	
-	TPRINTF("Stopping work queue...\n");
-	workq_stop(workq);
-	
-	TPRINTF("Destroying work queue...\n");
-	workq_destroy(workq);
+	res = test_workqueue3();
+	if (res) {
+		TPRINTF(res);
+		err = res;
+	}
 
-	return ret;
+	return err;
 }
-
Index: kernel/test/synch/workqueue2.def
===================================================================
--- kernel/test/synch/workqueue2.def	(revision 5b6c03370fd0afc552e341134e2e6161f611a180)
+++ kernel/test/synch/workqueue2.def	(revision 9f8745c5331a919e144b6084cb90d7f5b2eaccba)
@@ -1,12 +1,6 @@
 {
-	"workqueue2",
-	"Separate work queue test",
-	&test_workqueue2,
+	"workqueue",
+	"Separate and system work queue stress test",
+	&test_workqueue_all,
 	true
 },
-{
-	"workqueue2stop",
-	"Separate work queue test, stops early",
-	&test_workqueue2stop,
-	true
-},
Index: kernel/test/synch/workqueue3.c
===================================================================
--- kernel/test/synch/workqueue3.c	(revision 5b6c03370fd0afc552e341134e2e6161f611a180)
+++ kernel/test/synch/workqueue3.c	(revision 9f8745c5331a919e144b6084cb90d7f5b2eaccba)
@@ -57,5 +57,5 @@
 {
 	const char *err = 0;
-	
+	TPRINTF("Stress testing system queue.\n");
 	TPRINTF("First run:\n");
 	err = run_workq_core(exit_early);
Index: kernel/test/synch/workqueue3.def
===================================================================
--- kernel/test/synch/workqueue3.def	(revision 5b6c03370fd0afc552e341134e2e6161f611a180)
+++ kernel/test/synch/workqueue3.def	(revision 9f8745c5331a919e144b6084cb90d7f5b2eaccba)
@@ -1,8 +1,2 @@
-{
-	"workqueue3",
-	"Global work queue test",
-	&test_workqueue3,
-	true
-},
 {
 	"workqueue3quit",
Index: kernel/test/test.c
===================================================================
--- kernel/test/test.c	(revision 5b6c03370fd0afc552e341134e2e6161f611a180)
+++ kernel/test/test.c	(revision 9f8745c5331a919e144b6084cb90d7f5b2eaccba)
@@ -51,5 +51,4 @@
 #include <synch/semaphore2.def>
 #include <synch/rcu1.def>
-#include <synch/workqueue1.def>
 #include <synch/workqueue2.def>
 #include <synch/workqueue3.def>
Index: kernel/test/test.h
===================================================================
--- kernel/test/test.h	(revision 5b6c03370fd0afc552e341134e2e6161f611a180)
+++ kernel/test/test.h	(revision 9f8745c5331a919e144b6084cb90d7f5b2eaccba)
@@ -76,7 +76,5 @@
 extern const char *test_thread1(void);
 extern const char *test_smpcall1(void);
-extern const char *test_workqueue1(void);
-extern const char *test_workqueue2(void);
-extern const char *test_workqueue2stop(void);
+extern const char *test_workqueue_all(void);
 extern const char *test_workqueue3(void);
 extern const char *test_workqueue3quit(void);
