Index: kernel/generic/include/proc/task.h
===================================================================
--- kernel/generic/include/proc/task.h	(revision 0c426386b8c78cdb2776148a57bfec55cab535b2)
+++ kernel/generic/include/proc/task.h	(revision 278b4a3073e1c10f12dee772798386520fad774a)
@@ -133,4 +133,6 @@
 extern task_t *task_create(as_t *, const char *);
 extern void task_destroy(task_t *);
+extern void task_hold(task_t *);
+extern void task_release(task_t *);
 extern task_t *task_find_by_id(task_id_t);
 extern int task_kill(task_id_t);
Index: kernel/generic/src/proc/task.c
===================================================================
--- kernel/generic/src/proc/task.c	(revision 0c426386b8c78cdb2776148a57bfec55cab535b2)
+++ kernel/generic/src/proc/task.c	(revision 278b4a3073e1c10f12dee772798386520fad774a)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2001-2004 Jakub Jermar
+ * Copyright (c) 2010 Jakub Jermar
  * All rights reserved.
  *
@@ -257,4 +257,27 @@
 }
 
+/** Hold a reference to a task.
+ *
+ * Holding a reference to a task prevents destruction of that task.
+ *
+ * @param t		Task to be held.
+ */
+void task_hold(task_t *t)
+{
+	atomic_inc(&t->refcount);
+}
+
+/** Release a reference to a task.
+ *
+ * The last one to release a reference to a task destroys the task.
+ *
+ * @param t		Task to be released.
+ */
+void task_release(task_t *t)
+{
+	if ((atomic_predec(&t->refcount)) == 0)
+		task_destroy(t);
+}
+
 /** Syscall for reading task ID from userspace.
  *
